我正在尝试使用来自http://docs.spring.io/spring/docs/3.2.0.RELEASE/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers的spring文档中的示例来实现精细的@Autowired
配置。
给出以下测试用例:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=ExampleConfiguration.class)
public class ExampleTest {
@Autowired @ExampleQualifier(key="x")
private ExampleBean beanWithQualifierKeyX;
@Test
public void test() {
System.out.println(this.beanWithQualifierKeyX);
}
}
以及以下配置:
@Configuration
public class ExampleConfiguration {
@Bean
@ExampleQualifier(key = "x")
public ExampleBean exampleBean1() {
return new ExampleBean();
}
@Bean
@ExampleQualifier(key = "y")
public ExampleBean exampleBean2() {
return new ExampleBean();
}
@Bean
public ExampleBean exampleBean3() {
return new ExampleBean();
}
}
使用自定义限定符annoation:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ExampleQualifier {
String key();
}
我期望的是:属性beanWithQualifierKeyX
应该使用配置类中的第一个bean进行自动装配。配置上的注释和属性上的注释都具有key="x"
设置,因此这应该是唯一匹配。据我所知,这与Spring示例文档中的MovieQualifier
注释几乎相同。
但是,当我执行测试时,我收到以下错误:
org.springframework.beans.factory.BeanCreationException:
Could not autowire field: private xxx.ExampleBean xxx.ExampleTest.beanWithQualifierKeyX;
nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type [xxx.ExampleBean] is defined:
expected single matching bean but found 2: [exampleBean1, exampleBean2]
看起来Spring确实对注释执行了匹配(因为注释了exampleBean1
和exampleBean2
)但没有考虑注释的key
的值 - 否则x
将是一个完美的匹配。
我在配置过程中遗漏了什么或为什么没有匹配?
我使用的Spring版本是3.2.0.RELEASE
答案 0 :(得分:4)
Spring 3.2.0中存在/是一个错误Autowiring with @Qualifier and @Qualifier meta annotation fails in Spring 3.2(已在3.2.1中修复)
它的描述听起来和你的问题完全一样。
因此请更新至3.2.1