当前位置: 首页 > 面试题库 >

Spring @Autowired和@Qualifier

山森
2023-03-14
问题内容

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


问题答案:

你可以@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中引入了此功能。

  • 详细讨论该问题的博客文章
  • github上的原始问题
  • 还有一个小的github项目,可以看到它的实际效果

注意

如果你正在使用字段注入或设置器注入,则必须将@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;
    }

}


 类似资料:
  • 是否使用@autowired自动检测?使用@qualifier时是否按名称进行依赖注入?我们如何使用这些注释进行setter和constructor注入?

  • 我发现了一个问题,当使用@Enable缓存批注与@Inject/@autoweld在@Configuration类: 复制的简单示例: 配置类: 应用程序上下文启动器: 错误: 引起原因:org.springframework.beans.factory.Bean定义存储异常:工厂方法[公共org.springframework.cache.CacheManagerspring.samples.c

  • 我正在尝试向现有项目引入一个新bean 当前bean是 我正在尝试添加新的Bean到 从我想访问数据,在后期构造中,我想注册。所以我想调用方法 所有这些包都打包为jar和Spring上下文xml 但在部署期间,我得到了关于处于create状态的bean的异常 我还尝试删除@Autowired并使用获取对象。但我也犯了同样的错误。 如果我从xml文件中删除bean条目,它会得到正确的部署,但是pos

  • 问题内容: 我的User对象的Jackson序列化遇到问题。有一些带有getter和setter的私有字段。当我做这样的事情时,一切工作正常: 但是我想用Spring Framework自动连接User对象: 这是行不通的。我有一个错误: 当我尝试忽略这些未知错误时 我得到了无限递归: 看起来Spring在自动装配MyUser实例上做错了什么,因此Jackson无法序列化它。 有办法解决吗? 更新

  • 问题内容: 在Spring会连接的类中使用 @Autowired的 优缺点是什么? 只是为了澄清,我是在专门谈论 @Autowired 注释,而不是XML的自动 装配 。 我可能只是不了解它,但是对我来说,这几乎就像是一种反模式- 您的类开始意识到它们与DI框架相关联,而不仅仅是POJO。也许我是惩罚的嘴,但我喜欢为bean设置外部XML配置,并且我喜欢使用显式的接线,因此我确切知道在哪里接线。

  • 当我尝试使用@Autowired注入服务类时,我遇到了一些问题 我的Rest控制器: 我的服务: 界面: 抽象4眼服务: 我的堆栈跟踪: 我试图注入定居点服务,但它抛出java.lang.非法参数例外:无法设置项目.test.rms.服务.定居点类型服务字段项目.test.rms.controller.SettlementTypeController.service到 com.sun.proxy.