@Qualifier 和 @Primary 注解是 Spring Framework 中用于解决依赖注入歧义性的两种方式。
@Qualifier 注解:
@Qualifier 注解可以和 @Autowired 注解一起使用,用于指定要注入的具体实现类的 bean 名称。
当有多个实现类实现同一个接口或者父类时,Spring 无法确定要注入哪个实现类的实例,此时可以使用 @Qualifier 注解指定具体的 bean 名称。
示例代码如下:
public interface Vehicle {
void start();
}
@Component("car")
public class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started");
}
}
@Component("bike")
public class Bike implements Vehicle {
@Override
public void start() {
System.out.println("Bike started");
}
}
@Service
public class VehicleService {
@Autowired
@Qualifier("car") // 指定要注入的 bean 名称
private Vehicle vehicle;
public void startVehicle() {
vehicle.start();
}
}
@Primary 注解:
@Primary 注解用于标识一个 bean,表示当存在多个候选者时,优先选择被 @Primary 标注的 bean 进行注入。
当使用 @Autowired 注解进行自动装配时,如果没有指定具体的 @Qualifier,Spring 会优先选择被 @Primary 标注的 bean 进行注入。
示例代码如下:
@Component
@Primary // 标识为首选的 bean
public class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started");
}
}
@Component
public class Bike implements Vehicle {
@Override
public void start() {
System.out.println("Bike started");
}
}
@Service
public class VehicleService {
@Autowired
private Vehicle vehicle; // 自动装配时会优先选择被 @Primary 标注的 Car bean
public void startVehicle() {
vehicle.start();
}
}