春季@Autowired和@Qualifier [已关闭]
是否自动检测到 ?
使用时是否按名称注入依赖关系?
我们如何使用这些注释进行 setter 和构造函数注入?@Autowired
@Qualifier
是否自动检测到 ?
使用时是否按名称注入依赖关系?
我们如何使用这些注释进行 setter 和构造函数注入?@Autowired
@Qualifier
您可以与 一起使用。事实上,spring会要求您明确选择豆子,如果发现不明确的豆子类型,在这种情况下,您应该提供限定符@Qualifier
@Autowired
例如,在以下情况下,有必要提供限定符
@Component
@Qualifier("staff")
public Staff implements Person {}
@Component
@Qualifier("employee")
public Manager implements Person {}
@Component
public Payroll {
private Person person;
@Autowired
public Payroll(@Qualifier("employee") Person person){
this.person = person;
}
}
编辑:
在龙目岛 1.18.4 中,当您@Qualifier时,终于可以避免构造函数注入的样板,因此现在可以执行以下操作:
@Component
@Qualifier("staff")
public Staff implements Person {}
@Component
@Qualifier("employee")
public Manager implements Person {}
@Component
@RequiredArgsConstructor
public Payroll {
@Qualifier("employee") private final Person person;
}
前提是您正在使用新的 lombok.config 规则可复制注释(通过在项目的根目录的 lombok.config 中放置以下内容):
# Copy the Qualifier annotation from the instance variables to the constructor
# see https://github.com/rzwitserloot/lombok/issues/745
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
这是最近在最新的龙目岛1.18.4中引入的。
注意
如果您使用的是场或二传手注入,那么您必须将@Autowired和@Qualifier放在场或二传手功能的顶部,如下所示(其中任何一个都可以工作))
public Payroll {
@Autowired @Qualifier("employee") private final Person person;
}
或
public Payroll {
private final Person person;
@Autowired
@Qualifier("employee")
public void setPerson(Person person) {
this.person = person;
}
}
如果您使用的是构造函数注入,则应将注释放在构造函数上,否则代码将不起作用。使用方法如下 -
public Payroll {
private Person person;
@Autowired
public Payroll(@Qualifier("employee") Person person){
this.person = person;
}
}
该注释用于解决存在相同类型的多个 Bean 时的自动布线冲突。@Qualifier
该批注可用于使用 或使用 带批注的方法的任何类。此批注也可以应用于构造函数参数或方法参数。@Qualifier
@Component
@Bean
例如:-
public interface Vehicle {
public void start();
public void stop();
}
有两个豆子,汽车和自行车工具车辆接口
@Component(value="car")
public class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started");
}
@Override
public void stop() {
System.out.println("Car stopped");
}
}
@Component(value="bike")
public class Bike implements Vehicle {
@Override
public void start() {
System.out.println("Bike started");
}
@Override
public void stop() {
System.out.println("Bike stopped");
}
}
使用带有注释在车辆服务中注入自行车豆。如果你没有使用,它将抛出NoUniqueBeanDefinitionException。@Autowired
@Qualifier
@Qualifier
@Component
public class VehicleService {
@Autowired
@Qualifier("bike")
private Vehicle vehicle;
public void service() {
vehicle.start();
vehicle.stop();
}
}
参考:- @Qualifier注释示例