我们有一个应用程序,我们试图将一个空java.util.HashSet
注入到类型java.util.Set
的成员中,在一个本身就是一个@Component
的类中。春天似乎注入了一个包含类型的元素的HashSet
。知道为什么春天不只是注入一个空集吗?
设置元素类:
@Component
public class SetElement
{
private String value;
public String getValue()
{
return value;
}
}
包含 Set 作为成员的类:
@Component
public class MyClassWithSet
{
@Autowired
private Set<SetElement> setOfElements;
protected void setStringSet(Set<SetElement> stringSet)
{
this.setOfElements = stringSet;
}
public Set<SetElement> getStringSet()
{
return Collections.unmodifiableSet(setOfElements);
}
}
春天.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<bean id="setOfElements" class="java.util.HashSet" />
<context:component-scan base-package="com.vikdor.db " />
</beans>
用于确认行为的示例测试用例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =
{ "classpath:META-INF/spring.xml" })
public class SpringSetTest
{
@Autowired
private MyClassWithSet myClassWithSet;
@Test
public void test()
{
assertNotNull(myClassWithSet);
assertNotNull(myClassWithSet.getStringSet());
assertTrue(myClassWithSet.getStringSet().isEmpty());
}
}
如果在类型化集合实例上使用 @Autowired
,则会注入应用程序上下文中满足该类型的所有 bean:
也可以从 应用程序上下文 通过将注释添加到字段或方法,该字段或方法 期望这种类型的数组 [...]这同样适用于类型化 收集:
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/beans.html#beans-autowired-annotation
因此,您的单个SetElement
实例被注入到@Autowired Set<SetElement>
中。一个可能的解决方案是为该字段使用二传手。或者,您可以使用 @Qualifier
注释或@Resource
注释按名称引用 Bean。