弹簧 @Autowired 和 @Qualifier

新手上路,请多包涵

是否使用 @Autowired 自动检测到?

当使用 @Qualifier 时,它是按名称进行的依赖注入吗?

我们如何使用这些注解进行 setter 和构造函数注入?

原文由 Dhananjaya Senanayake 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 471
1 个回答

您可以将 @Qualifier@Autowired --- 一起使用。事实上,如果发现不明确的 bean 类型,spring 会要求您明确选择 bean,在这种情况下,您应该提供限定符

例如,在以下情况下,有必要提供限定符

@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;
    }

}

编辑:

在 Lombok 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 规则 copyableAnnotations(通过将以下内容放在项目根目录的 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

这是最近在最新的 lombok 1.18.4 中引入的。

笔记

如果您正在使用字段或 setter 注入,那么您必须将 @Autowired 和 @Qualifier 放在字段或 setter 函数的顶部,如下所示(它们中 _的任何一个都可以工作_)

 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;
    }

}

原文由 kuhajeyan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题