@Autowired:自动装配。spring利用依赖注入(DI),完成对IOC容器的各个组件的依赖关系赋值。
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD,
ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
从@Autowired定义可以看到,此注解可以对类成员变量、方法、参数及构造函数进行标注,完成自动装配的工作。
@Component
@Data
public class Boss {
@Autowired
private Cat cat;
private Car car;
private Dept dept;
private Woman woman;
/**
* 标注在构造器上,Spring容器创建当前对象,就会调用方法完成赋值,
* constructor does not have to be public.构造函数不必公开
* 方法中的参数直接从IOC容器中获取,标注在其他位置也是一样,都是从IOC容器中拿
*/
@Autowired
public Boss(Car car){
System.out.println("自动装配了cat");
this.car = car;
}
//标注在参数上,IOC容器创建对象时不会自动调用,参数直接从IOC容器中拿来
public void setDept(@Autowired Dept dept){
System.out.println("自动装配了dept");
this.dept = dept;
}
@Autowired //标注在方法上,IOC容器创建对象时自动调用,参数直接从IOC容器中拿来
public void setWoman(Woman woman){
System.out.println("自动装配了woman");
this.woman = woman;
}
}
@Autowired注解的一些规则:
1.默认使用类型去容器中找对应的组件,如果存在多个,则默认通过属性的名称查找对应的组件,如果找不到正确的组件,则会保存。
2.required:默认为true,required=false,允许组件找不到,即使找不到组件,也不会报错。
3.@Primary: 首选项,当存在多个相同类型的组件时,自动装配有@Primary标注的组件,覆盖默认查找规则。
4.@Qualifier: 按指定名称装配,覆盖@Primary首选项规则。