Solon v3.0.3

@Component 与 @Bean 的区别

</> markdown

@Component 与 @Bean 设计的目的是一样的,都是注册 Bean 到容器里。

1、注解属性

属性描述默认值支持注解
value名字 @Bean, @Component
name名字(与 value 互为别名) @Bean, @Component
tag标签,用于特征查找 @Bean, @Component
typed按类型注册,名字非空时有效(注1)false@Bean, @Component
index产生后的对象排序(越小越先)0@Bean, @Component
priority产生前的运行优先级(越大越优) @Bean
registered要注册能力接口的 (注2)true@Bean, @Component
injected要注入的(注3)false@Bean
initMethod初始化方法(v2.8.6 后支持) @Bean
destroyMethod注销方法(v2.8.6 后支持) @Bean
  • 注1:托管对象默认是按类型注册的;当有名字时,则以名字注册,若仍需类型注册,需要 typed=true
  • 注2:比如过滤器会自动注册到根路由体系
  • 注3:@Bean 是用于手动构建托管 bean 的,如果内部有注入注解,需要 injected=true

2、注解主要区别

@Component@Bean
装配方式自动装配手动装配
作用范围注解在类上注解在 @Configuration 类的 public 方法上
单例控制可以申明自己是不是单例只能是单例
类型注册以实例类型进行注册
(同时会注册,一级父接口类型)
同时注册返回的 申明类型 和 实例类型
(以及注册,它们的一级父接口类型)

3、@Component 注解(自动组装托管对象)

  • 以及 @Configuration,@Controller,@Remoting 都是注解在类上的
  • 告诉 Solon,当前是个托管组件
  • 可以申明自己是不是单例
  • 通过类路径扫描自动检测并注入到容器中
  • 可以 @Inject 东西
  • 可以自动装配自己
  • 以类型注册时,以实例类型进行注册(同时会注册,一级父接口类型)

其中 @Controller,@Remoting 类的函数会重新包装成 MethodWarp,支持代理效果。

其中 @Component (当有AOP需求时,会自动代理)由 ASM 或 AOT 为其生成代理类,支持代理效果。

4、@Bean 注解(处理需要手动“组装”的托管对象)

  • 不能注释在类上
  • 只能用于在 @Configuration 类的函数上,中显式声明单个 Bean
  • 且,只支持注在 public 函数上
  • 意思就是,我要获取这个Bean的时候,框架要按照这种方式去获取这个Bean
  • 只能是单例
  • 不可以 @Inject 东西(如果有,需要 injected=true)
  • 需要手动装配
  • 以类型注册时,同时注册返回类型和实例类型(以及注册,它们的一级父接口类型)

在应用开发的过程中,如果想要将“第三方库”中的组件装配到应用容器中,是没有办法在它的类上添加 @Component 、@Inject 注解的,因此就不能使用自动化装配的方案了。

如果“第三方库”中的组件有 @Component 注解,但没有扫描到。可以在启动类上加 @Import 注解进行导入。