gpt4 book ai didi

java - Spring 注入(inject)一个单元素 Set 而不是空 Set

转载 作者:行者123 更新时间:2023-11-30 07:22:33 24 4
gpt4 key购买 nike

我们有一个应用程序,我们试图将一个空的 java.util.HashSet 注入(inject)到类型为 java.util.Set 的成员中,该类本身是是一个@Component。 Spring 似乎用包含类型的一个元素注入(inject)了一个HashSet。知道为什么 Spring 不只是注入(inject)一个空集吗?

设置元素类:

@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());
}

}

最佳答案

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

It is also possible to provide all beans of a particular type from the ApplicationContext by adding the annotation to a field or method that expects an array of that type [...] The same applies for typed collections:

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 的单个实例被注入(inject) @Autowired Set<SetElement> .一个可能的解决方案是为该字段使用一个 setter 。或者,您可以使用 @Qualifier注释或 @Resource按名称引用 bean 的注释。

关于java - Spring 注入(inject)一个单元素 Set 而不是空 Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com