两者的联系和区别
@Component 和 @Bean 是两种使用注解来定义 bean 的方式。
- @Component(和 @Service, @Repository)用于自动检测和使用类路径扫描自动配置 bean。注释类和 bean 之间存在隐式的一对一映射(即每个类一个 bean)。这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。
- @Bean 用于显式声明单个 bean,而不是让 Spring 像上面那样自动执行它。它将 bean 的声明与类定义分离,并允许您精确地创建和配置 bean。
@Componentpublic class Student {private String name = "lkm";public String getName() {return name;}public void setName(String name) {this.name = name;}}
而 @Bean 则常和 @Configuration 注解搭配使用
@Configurationpublic class WebSocketConfig {@Beanpublic Student student(){return new Student();}}
都可以使用 @Autowired 或者 @Resource 注解注入
@AutowiredStudent student;
为什么有了 @Compent,还需要 @Bean 呢
如果想将第三方的类变成组件,你又没有没有源代码,也就没办法使用 @Component 进行自动配置,这种时候使用@Bean 就比较合适了。不过同样的也可以通过 xml 方式来定义。
另外 @Bean 注解的方法返回值是对象,可以在方法中为对象设置属性。
另外大家可以了解一下 Spring 的 Starter 机制,就是通过 @Bean 注解来定义 bean。
可以搭配 @ConditionalOnMissingBean 注解 @ConditionalOnMissingClass 注解,如果本项目中没有定义该类型的 bean 则会生效。
避免在某个项目中定义或者通过 @congfig 注解来声明大量重复的 bean。
