2

我们有一个应用程序,我们试图在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);
    }
}

春天.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());
    }

}
4

1 回答 1

4

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

也可以通过将注释添加到需要该类型数组的字段或方法来从 ApplicationContext 提供特定类型的所有 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。

于 2012-09-27T18:55:06.483 回答