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