java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring创建Bean方式

Spring创建Bean的多种方式对比与最佳实践

作者:渣哥

本文详细梳理了Spring项目中Bean的六种常见创建方式(@Component、@Bean、FactoryBean、@Import、XML、运行时注册),对每种适用场景、优缺点与最佳实践进行了总结,并给出了选择方法的决策清单与常见误区规避建议,需要的朋友可以参考下

第一次接手老项目,我最懵的一件事是:同一个项目里,创建 Bean 的姿势能有五六种——@Component@BeanFactoryBean@Import、XML、甚至运行时注册。到底选谁?标准究竟是什么?

下面把常见方式逐一拆开,顺手给你一张“怎么选”的脑图。

一、有哪些主流方式?

1) 组件扫描:@Component 家族(含 @Service/@Repository/@Controller)

怎么用

@Component
public class OrderService { }

特点

何时选:90% 的业务类、无外部构造复杂度的 Bean。

2) Java 配置:@Configuration + @Bean

怎么用

@Configuration
public class AppConfig {
  @Bean
  public IdGenerator idGenerator() { return new SnowflakeIdGenerator(...); }
}

特点

何时选

3) FactoryBean<T>:自定义工厂

怎么用

@Component
public class ClientFactoryBean implements FactoryBean<Client> {
  public Client getObject() { return new Client(config()); }
  public Class<?> getObjectType() { return Client.class; }
}

特点

何时选:构造过程复杂、需要“拿结果不是拿工厂”的场景。

4) @Import 家族:装配拼装器

怎么用

特点

何时选框架/组件开发、Starter、按类路径/环境动态装配。

5) XML(<bean/>)

特点

何时选:遗留项目、平台强约束、需运行时热替换 XML 的场景。

6) 运行时注册:BeanDefinitionRegistry / GenericApplicationContext#registerBean

怎么用

context.registerBean("userRepo", UserRepo.class, () -> new UserRepo(ds));

特点

何时选框架层、插件/脚手架、动态场景。

二、怎么选?——一张可落地的决策清单

  1. 普通业务类@Component(或语义化的 @Service/@Repository),配合构造器注入
  2. 第三方对象/需要精细控制(连接池、客户端、线程池)→ @Configuration + @Bean
  3. 创建逻辑复杂/需要返回“产品而非工厂”FactoryBean
  4. 模块化/Starter/按条件成批装配@ImportImportSelector/Registrar)+ @Conditional
  5. 遗留或平台要求 → XML。
  6. 动态注册/插件化 → 运行时注册 API。

高频口诀:“业组件、库配 Bean、难用工厂、批量用 Import、老活交 XML、动态上 Registry。”

三、组合拳:把方式与“条件/环境/范围/生命周期”拼起来

条件装配@Conditional / @Profile

作用域@Scope("singleton"|"prototype"|"request"|"session")

懒加载@Lazy

优先/歧义@Primary / @Qualifier("xxx")

生命周期initMethod/destroyMethod@PostConstruct/@PreDestroy

配置类性能@Configuration(proxyBeanMethods = false)

四、常见踩坑与规避

  1. 同名/同类型冲突
  1. 原型 Bean 生命周期失控
  1. @Configuration 误用导致“重复实例化”
  1. FactoryBean 取到的是“产品不是工厂”
  1. 条件/环境不生效
  1. AOP/事务不起效

五、最佳实践清单(可直接落地)

写在最后

把“谁创建、何时创建、在哪创建、如何销毁”说清楚,就是 Bean 策略的全部。 业务常态化用 @Component;第三方与精细控制用 @Bean;复杂构造上 FactoryBean;模块化上 @Import;其余按场景增量选择。 选对方式,系统启动快、结构清晰、扩展成本更低。

以上就是Spring创建Bean的多种方式对比与最佳实践的详细内容,更多关于Spring创建Bean方式的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文