@Autowired

首先根据类型找到对应的 Bean,如果对应类型的 Bean 不是唯一的,那么它会根据其属性名称 Bean 的名称进行匹配。如果匹配得上,就会使用该 Bean ;如果还无法匹配,就会抛出异常。

@Autowired 
private Animal dog; // 注入 Dog ,而不是 Cat

如果不能确定标注属性一定会存在并且允许该属性为 null,那么可以配置属性 required=false

@Autowired(required = false)

它除了可以标注属性外,还可以标注方法。可以使用 set 方法从 IoC 容器中找到对应的 Bean 进行注入。

@Autowired 
public void setAnimal(Animal animal) { 
	this.animal = animal; 
}

@Primary

Animal 有两个实现类(Dog,Cat),Spring 无法通过 @Autowired 选择到底注入哪一个。这时候可以使用 @Primary 告诉 Spring,当出现选择困难症时,优先选择 @Primary 标注的类。

@Primary
@Component
public Cat implements Animal {
    ......
}

@Qualifier

@Autowired 组合使用,通过类型和名称一起找到 Bean。

@Autowired 
@Qualifier("dog")
private Animal animal;

带有参数的构造方法类的装配

@Component
public class BussinessPerson implements Person
 
    private Animal animal = null;
 
    public BussinessPerson(@Autowired @Qualifier("dog") Animal animal) {
        this.animal = animal;
    }
}