我们有一个应用程序,我们尝试将空java.util.HashSet
注入类型为java.util.Set
的成员中,该类本身为@Component
。 Spring似乎为HashSet
注入了一个包含类型的元素。知道Spring为什么不注入空集?
设置元素类:
@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);
}
}
Spring.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());
}
}
答案 0 :(得分:3)
如果在类型化集合实例上使用@Autowired
,则会注入满足该类型的应用程序上下文中的所有bean:
也可以从中提供特定类型的所有bean ApplicationContext通过将注释添加到字段或方法中 期望该类型的数组[...]同样适用于类型 集合:
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
因此,SetElement
的单个实例会被注入@Autowired Set<SetElement>
。一种可能的解决方案是使用场的设定器。或者,您可以使用@Qualifier
注释或@Resource
注释来按名称引用bean。