我正在学习Spring Boot中使用@Primary和@Qualifier注解的自动装配。我能够理解@Primary将带注释的类连接为依赖项,如果找到多个满足条件的类,@Qualifier可以提供帮助。
@Component
public class VehicleBean {
@Autowired
@Qualifier("car")
Vehicle car;
public void check() {
car.details();
}
public Vehicle getCar() {
return car;
}
public void setCar(Vehicle car) {
this.car = car;
}
}自行车
@Component
//@Primary
@Qualifier("car")
public class Bike implements Vehicle {
@Override
public void details() {
System.out.println("Bike is driving");
}
}小汽车
@Component
//@Primary
@Qualifier("bike")
public class Car implements Vehicle {
@Override
public void details() {
System.out.println("Car is driving");
}
}但是,当我在自行车和汽车上交换@Qualifier时(例如在汽车上用- @Qualifier("bike"),反之亦然),它会拿起自行车。另外,当我将@Qualifier更改为"bike on my autowired " Car“,并在Bike上有@Qualifier("car"),反之亦然,它是在选择Car。我希望Bike会被选中。我遗漏了什么?
发布于 2019-07-23 17:36:53
此处使用限定符注释是不正确的,限定符注释用于字段、参数或方法,以便在编写时选择写入候选bean。
在自动装配时,此注释可以在字段或参数上用作候选bean的限定符。(JAVA DOC)
简单地说,您通过名称定义bean,并通过添加@Qualifier来告诉spring选择哪个名称,在您的示例中,您必须在@Component中添加bean名称。
@Component("bike")
public class Bike implements Vehicle {
@Override
public void details() {
System.out.println("Bike is driving");
}
}
@Component("car")
public class Car implements Vehicle {
@Override
public void details() {
System.out.println("Car is driving");
}
}对于你的问题,为什么它选择Car?,因为如果没有人指定,AnnotationBeanNameGenerator会生成一个默认名称,并且构建的名称是基于类的短名称(第一个字母小写):
如果注解的值不表示bean名称,则将基于类的短名称(第一个字母小写)构建适当的名称。例如:
com.xyz.FooServiceImpl -> fooServiceImpl (JAVA DOC)
发布于 2019-07-23 18:05:38
@Component @Qualifier("car"),@Qualifier注解在这里不起作用。它可以用在一个字段,一个参数或一个自动装配的方法上。
像@Component("car")一样,您只需要使用@Component注释传递名称
https://stackoverflow.com/questions/57159933
复制相似问题