- @Autowired注解自动装配原理
@Data
@Service
public class BookService {
@Qualifier("bookDao3")
@Autowired(required = false)
private BookDao bookDao;
}
/**
* 当容器中同时有多个BookDao对象时,在进行自动装配时,优先装配标注了@Primary注解的bean
* @return
*/
@Primary
@Bean
public BookDao bookDao2(){
return new BookDao();
}
BookService中需要装配BookDao,则按照以下原理来装配。
1.默认优先按照类型去容器中找
2.如果相同的类型有多个,则按照属性名去容器中找,如果容器中有多个 BookDao,则按照属性名bookDao当做id去容器中找。
3.@Qualifier(“bookDao2”) 即使属性名为bookDao,但是用了该注解,spring就会找bookDao2这个bean
4.@Autowired默认是必须装配好该组件的,如果容器中找不到会报错,通过@Autowired(required = false)
指定当容器中找不到该bean时,允许该属性为null
5.当容器中同时有多个BookDao对象时,在进行自动装配时,优先装配标注了@Primary注解的bean。
@Autowired作用的位置
1. 作用于成员变量上
@Autowired
private Car car;
2. 作用与构造方法和set方法,参数的值会自动从容器中获取
@Autowired
public Boss(Car car){
this.car = car;
}
@Autowired
public void setCar(Car car) {
this.car = car;
}
3. 作用于形参位置上
在给容器中使用@Bean添加组件时,如果bean需要参数,则参数的值可以从容器中获取。
注意:当@Autowired 标注在构造方法,set方法和形参位置时,@Autowired 可以省略
@Bean
public Boss boss(@Autowired Car car){
Boss boss = new Boss(car);
return boss;
}