@Bean注册同名的bean的处理过程

@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
知识有限,欢迎指正。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值