开发者

Spring创建Bean的八种主要方式详解

开发者 https://www.devze.com 2025-08-19 10:35 出处:网络 作者: 小兔兔吃萝卜
目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解(最常用)2. @Configuration + @Bean(手动注册)3. @EnableConfigurationProperties + @ConfigurationProperties4. @Import(导入配置类或
目录
  • 引言
  • 一、Spring 创建 Bean 的 8 种主要方式
    • 1. @Component 及其衍生注解(最常用)
    • 2. @Configuration + @Bean(手动注册)
    • 3. @EnableConfigurationProperties + @ConfigurationProperties
    • 4. @Import(导入配置类或直接注册)
      • (1) 导入 @Configuration 类
      • (2) 导入 @Component 类
      • (3) 导入 ImportSelector 或 ImportBeanDefinitionRegistrar
    • 5. 实现 FactoryBean<T>(创建复杂对象)
      • 6. @Conditional 系列注解(条件化注册)
        • 7. 编程式注册:BeanDefinitionRegistryPostProcessor
          • 8. XML 配置(传统方式)
          • 总结对比
            • 最佳实践建议

              引言

              Spring(尤其是 Spring Boot)提供了多android种方式来让容器创建和管理 Bean。@Component@Configuration + @Bean@EnableConfigurationProperties 都是常见方式。

              下面我为你系统地梳理 Spring 创建 Bean 的所有主要方式,并说明它们的使用场景和区别。

              一、Spring 创建 Bean 的 8 种主要方式

              方式注解/方法适用场景
              1@Component 及其衍生注解扫描普通类为 Bean
              2@Configuration + @Bean手动配置第三方类或复杂对象
              3@EnableConfigurationProperties + @Configuration编程客栈Properties将配置文件映射为 Bean
              4@Import导入配置类或直接注册 Bean
              5实现 FactoryBean<T>创建复杂或条件性对象
              6使用 @Conditional 系列注解条件化http://www.devze.com注册 Bean
              7编程式注册:BeanDefinitionRegistryPostProcessor动态注册 Bean(高级)
              8XML 配置(传统方式)老项目兼容

              1. @Component 及其衍生注解(最常用)

              @Component
              @Service
              @Repository
              @Controller
              @RestController
              @Configuration // @Configuration 也是 @Component
              
              • 原理:配合 @ComponentScan,Spring 会扫描这些类并注册为 Bean。
              • 适用:你自己写的业务类(Service、DAO、Controller 等)。
              @Service
              public class UserService {
                  public void save() { ... }
              }
              

              ✅ 自动注册为 userService Bean。

              2. @Configuration + @Bean(手动注册)

              用于注册不能加 @Component 的类(如第三方库的类)。

              @Configuration
              public class RedisConfig {
                  
                  @Bean
                  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
                      RedisTemplate<String, Object> template = new RedisTemplate<>();
                      template.setConnectionFactory(factory);
                      return template;
                  }
              }
              
              • 适用:数据源、RedisTemplate、RabbitMQ、RocketMQ、OkHttp、HttpClient 等第三方组件。

              3. @EnableConfigurationProperties + @ConfigurationProperties

              application.yml 中的配置自动绑定为 Bean。

              app:
                title: MyApp
                version: 1.0.0
              
              @Component
              @ConfigurationProperties(prefix = "app")
              public class AppProperties {
                  private String title;
                  private String version;
                  // getter/setter
              }
              
              @Configuration
              @EnableConfigurationProperties(AppProperties.class)
              public class AppConfig {
              }
              

              AppProperties 会被 Spring 创建并注入配置值,且可被 @Autowired

              在 Spring Boot 2.2+ 中,@EnableConfigurationProperties 通常可以省略,只要类加了 @ConfigurationProperties 并被扫描到即可。

              4. @Import(导入配置类或直接注册)

              三种用法:

              (1) 导入 @Configuration 类

              @Import(DatabaseConfig.class)
              @SpringBootApplication
              public class Application { }
              

              (2) 导入 @Component 类

              @Import(UserService.class)
              

              (3) 导入 ImportSelector 或 ImportBeanDefinitionRegistrar

              @Import(MyImportSelector.class)
              public class Application { }
              
              public class MyImportSelector implements ImportSelector {
                  @Override
                  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
                      return new String[]{MyService.class.getName()};
                  }
              }
              

              ✅ 用于实现“条件导入”、“SPI 扩展”等高级功能。

              5. 实现 FactoryBean<T>(创建复杂对象)

              当你需要复杂的创建逻辑时使用。

              public class MyFactoryBean implements FactoryBean<MyService> {
              
                  @Override
                  public MyService getObject() throws Exception {
                      MyService service = new MyService();
                      service.init(); // 复杂初始化
                      return service;
                  }
              
                  @Override
                  public Class<?> getObjectType() {
                      return MyService.class;
                  }
              
                  @Override
                  public boolean isSingleton() {
                      return true;
                  }
              }
              
              @Component
              public class MyFactoryBean { } // Spring 会调用 getObject() 创建 MyService Bean
              

              ✅ 适合创建代理对象、动态对象、SPI 实现等。

              6. @Conditional 系列注解(条件化注册)

              只有满足条件时才创建 Bean。

              @Bean
              @ConditionalOnMissingBean(DataSource.class)
              public DataSource dataSource() {
                  return new HikariDataSource();
              }
              

              常见条件注解:

              注解说明
              @ConditionalOnClass类路径存在某个类
              @ConditionalOnMissingBean容器中没有某个 Bean
              @ConditionalOnProperty配置文件中有某个属性
              @ConditionalOnWebApplication是 Web 应用
              @ConditionalOnExpressionSpEL 表达式为 true

              ✅ 这是 Spring Boot 自动配置的核心机制。

              7. 编程式注册:BeanDefinitionRegistryPostProcessor

              最强大、最灵活的方式,可以在容器启动时动态注册 Bean。

              @Component
              public class DynamicBeanRegistrar implements BeanDefinitionRegistryPostProcessor {
              
                  @Override
                  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
                      BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(UserService.class);
                      AbstractBeanDefinition definition = builder.getBeanDefinition();
                      registry.registerBeanDefinition("userServ编程ice", definition);
                  }
              
                  @Override
                  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
                      // do nothing
                  }
              }
              

              ✅ 适合插件化、动态加载、AOP 增强等场景。

              8. XML 配置(传统方式)

              <bean id="userService" class="com.example.UserService"/>
              
              ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
              

              ❌ 现在已不推荐,但在老项目中仍可见。

              总结对比

              方式何时使用推荐度
              @Component自己写的类⭐⭐⭐⭐⭐
              @Configuration + @Bean第三方类、复杂配置⭐⭐⭐⭐⭐
              @ConfigurationProperties配置文件映射⭐⭐⭐⭐
              @Import模块化导入⭐⭐⭐
              FactoryBean复杂对象创建⭐⭐⭐
              @Conditional条件注册⭐⭐⭐⭐(自动配置核心)
              BeanDefinitionRegistryPostProcessor动态注册⭐⭐(高级)
              XML老项目

              最佳实践建议

              1. 优先使用 @Component@Bean,简单直接;
              2. 配置参数用 @ConfigurationProperties,类型安全;
              3. 避免重复注册,善用 @ConditionalOnMissingBean
              4. 复杂逻辑用 @ImportFactoryBeanjs
              5. 动态场景用 BeanDefinitionRegistryPostProcessor(谨慎使用)。

              以上就是Spring创建Bean的八种主要方式详解的详细内容,更多关于Spring创建Bean方式的资料请关注编程客栈(www.devze.com)其它相关文章!

              0

              精彩评论

              暂无评论...
              验证码 换一张
              取 消

              关注公众号