@Bean可以用于将对象注册到spring的容器中进行管理,通常用于注解方法,注册的对象名默认为方法名

@Bean
public User createUser() {
    System.out.println("user1");
    return new User("mygw1");
}

 此时spring容器中的bean的名称为createUser.
 @Bean也可以自定义bean的名称,使用@Bean(name = "customBeanName")即可

@Bean(name =  "user")
public User createUser(){
   System.out.println("user1");
   return new User("mygw1");
}


@Bean同名分为几种场景
 

1.当多个@bean存在同一个组件之下(同一个被@Componet,@Configuration等注解注释的类中)


  当发生@Bean 注册bean时,发现spring容器中已经存在同名的bean时,此时spring会放弃注册此bean.

@Bean(name =  "user")
public User createUser1(){
   System.out.println("user1");
   return new User("mygw1");
}

@Bean(name =  "user")
public User createUser2(){
   System.out.println("user2");
   return new User("mygw2");
}

 此时,由于@Bean通过name指定了两个bean的名称都为user,因此当spring注册时:

 执行createUser1()方法,返回名为mygw1的对象放入spring容器.
 createUser2()不会执行,名为mygw2的对象也不会执行放入spring容器

2.@Bean在不同组件之中:@Bean此时注册同名的bean,会报错:

   could not be registered. A bean with that name has already been defined in class path resource xxx.
   Action:
   Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

 此时可以根据提示在application.yml中添加 spring.main.allow-bean-definition-overriding=true.
 运行结果不再报错,但是依然只会执行一个createBean()方法,创建一个bean放入容器中,结论和1中相同。

3.当@Bean指定的对象类型相同,但是名字不同时,容器中不再是一个对象,而是存在两个bean,在@Autowired时需要通过@Qualifier指定bean的名称。

 因为@Autowired默认通过bean的类型进行注入: 

(1)如果同类型的bean有多个,转换为通过name进行注入。

(2)如果所有name均不匹配,不使用@Qualifier指定bean的name,则会报错.

 因为此时spring无法判断使用哪个bean进行注入。 

注: @RequiredArgsConstructor 可以取代@Autowired。详见: https://my.oschina.net/yejunxi/blog/2209101
知识有限,欢迎指正。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐