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