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



我们有一个应用程序,我们试图将一个空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。

相关内容

最新更新