春季@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注释示例
 
				    		 
				    		 
				    		 
				    		