两者的联系和区别

@Component@Bean 是两种使用注解来定义 bean 的方式。

  • @Component(和 @Service, @Repository)用于自动检测和使用类路径扫描自动配置 bean。注释类和 bean 之间存在隐式的一对一映射(即每个类一个 bean)。这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。
  • @Bean 用于显式声明单个 bean,而不是让 Spring 像上面那样自动执行它。它将 bean 的声明与类定义分离,并允许您精确地创建和配置 bean。
  1. @Component
  2. public class Student {
  3. private String name = "lkm";
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. }

@Bean 则常和 @Configuration 注解搭配使用

  1. @Configuration
  2. public class WebSocketConfig {
  3. @Bean
  4. public Student student(){
  5. return new Student();
  6. }
  7. }

都可以使用 @Autowired 或者 @Resource 注解注入

  1. @Autowired
  2. Student student;

为什么有了 @Compent,还需要 @Bean 呢

如果想将第三方的类变成组件,你又没有没有源代码,也就没办法使用 @Component 进行自动配置,这种时候使用@Bean 就比较合适了。不过同样的也可以通过 xml 方式来定义。

另外 @Bean 注解的方法返回值是对象,可以在方法中为对象设置属性。

另外大家可以了解一下 Spring 的 Starter 机制,就是通过 @Bean 注解来定义 bean。

可以搭配 @ConditionalOnMissingBean 注解 @ConditionalOnMissingClass 注解,如果本项目中没有定义该类型的 bean 则会生效。

避免在某个项目中定义或者通过 @congfig 注解来声明大量重复的 bean。

参考文章