我有许多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
在这种情况下不起作用吗?有没有已知的解决方法?
答案 0 :(得分:2)
您确定要按类型和注释注入使用autowire吗?按类型自动装配意味着spring将尝试使用类型查找注入检测到的setter和构造函数参数,即使它们未注释为注入。
同时您尝试按名称注入字段。您的@Service
注释类生成的bean分别默认为类名“testOneBean”和“testTwoBean”。 @Qualifier
使用bean名称作为正确匹配。建议的“按名称”注入的方法是使用@Resource(name="testOneBean")
。由于autowire模式设置为类型(我怀疑你真的需要),我只能猜测弹簧尝试按类型注入。
我建议恢复默认的自动装配模式并使用@Resource
按名称进行布线。