当bean在另一个jar文件中时,Spring @Qualifier无法正常工作

时间:2012-03-05 09:09:00

标签: spring dependency-injection classpath

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

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

的Myproj-共享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;

}

我在运行时得到“没有名称为”异常的唯一bean:

  

org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名为'testConsumerBean'的bean在文件[ - ]中定义时出错:   通过bean属性'bean'表示的不满意的依赖:::不   定义了[com.myco.ITestBean]类型的唯一bean:expected single   匹配bean但找到2:[testOneBean,testTwoBean];嵌套   例外是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   定义了[com.myco.TestBean]类型的唯一bean:expected single   匹配bean但找到2:[testOneBean,testTwoBean] at   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1167)   ...

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

1 个答案:

答案 0 :(得分:2)

您确定要按类型和注释注入使用autowire吗?按类型自动装配意味着spring将尝试使用类型查找注入检测到的setter和构造函数参数,即使它们未注释为注入。

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

我建议恢复默认的自动装配模式并使用@Resource按名称进行布线。