Spring注入一个单元素集而不是空集

时间:2012-09-27 18:31:50

标签: java spring

我们有一个应用程序,我们尝试将空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());
    }

}

1 个答案:

答案 0 :(得分:3)

如果在类型化集合实例上使用@Autowired,则会注入满足该类型的应用程序上下文中的所有bean:

  

也可以从中提供特定类型的所有bean   ApplicationContext通过将注释添加到字段或方法中   期望该类型的数组[...]同样适用于类型   集合:

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。