【问题标题】:Spring @Qualifier not working when bean is in another jar file当bean在另一个jar文件中时,Spring @Qualifier不起作用
【发布时间】:2012-03-05 09:09:00
【问题描述】:

我有许多 Spring bean,其中一些位于共享库 jar 中。我似乎无法让@Qualifier 工作。

我将 default-autowire 设置为 "byType",这是使用 Spring 3.1.0.M2 并作为独立可执行文件运行。如果我从共享库中删除“TestTwoBean”,项目将按预期执行。

myproj-shared-lib.jar:

@Service
public class TestOneBean implements ITestBean {
}

@Service
public class TestTwoBean implements ITestBean {
}

myproj.jar:

@Service
public class TestConsumerBean {

    @Autowired @Qualifier("testOneBean")
    private ITestBean bean;

}

我在运行时得到 “no unique bean with name” 异常:

org.springframework.beans.factory.UnsatisfiedDependencyException: 创建文件 [-] 中定义的名称为“testConsumerBean”的 bean 时出错: 通过 bean 属性 'bean' 表示的不满足的依赖关系: : 否 [com.myco.ITestBean] 类型的唯一 bean 已定义:预期为单个 匹配 bean 但找到 2:[testOneBean, testTwoBean];嵌套的 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 [com.myco.TestBean] 类型的唯一 bean 已定义:预期为单个 匹配 bean 但找到 2: [testOneBean, testTwoBean] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1167) ...

@Qualifier 在这种情况下不起作用吗?有已知的解决方法吗?

【问题讨论】:

  • 我认为,通过修改@Service("testOneBean") public class TestOneBean implements ITestBean { } 应该可以工作

标签: spring dependency-injection classpath


【解决方案1】:

您确定要使用按类型自动装配和注解注入吗?按类型自动装配意味着 spring 将尝试使用按类型查找来注入检测到的设置器和构造函数参数,即使它们没有为注入注解。

同时,您正在尝试按名称注入字段。您的@Service 注释类生成的bean 的名称分别默认为类名“testOneBean”和“testTwoBean”。 @Qualifier 使用 bean 名称作为正确匹配项。推荐的“按名称”注入方法是使用@Resource(name="testOneBean")。由于 autowire 模式设置为按类型(我怀疑您是否真的需要),我只能猜测 spring 按类型尝试注入。

我建议恢复默认自动连线模式并使用@Resource 按名称连线。

【讨论】:

  • 一些优点。该应用程序的其余部分最初使用零配置方法(按类型自动装配,无注释)工作,但这个新的重复 bean 问题打破了惯例。看起来没有简单的方法可以混合这两种方法,所以我重构了整个代码库以使用严格的连线 (default-autowire="no") 并注释所有的 bean。这已经修复了异常,并且应该避免这种类型的未来回归。谢谢!
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2018-07-20
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多