春季@Autowired和@Qualifier [已关闭]

2022-08-31 20:26:14

是否自动检测到 ?
使用时是否按名称注入依赖关系?
我们如何使用这些注释进行 setter 和构造函数注入?@Autowired@Qualifier


答案 1

您可以与 一起使用。事实上,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;
    }

}

答案 2

该注释用于解决存在相同类型的多个 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注释示例


推荐