2012-09-27 45 views
2

我們有一個應用程序,我們試圖將一個空的java.util.HashSet注入java.util.Set類型的成員中,本身是@Component。春天似乎注入了一個HashSet與包含類型的一個元素。任何想法爲什麼春天不只是注入一個空集?彈簧注入一個單元集而不是一個空集

集元素類:

@Component 
public class SetElement 
{ 
    private String value; 

    public String getValue() 
    { 
     return value; 
    } 
} 

類包含一組作爲成員:

@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

是測試類中的* only *測試方法嗎? – parsifal

+0

是的,沒有別的。實際上,這些是整個eclipse項目中的四個文件,我試圖重現這個問題(在我們在大型應用程序中發現這個問題之後)。 – Vikdor

+0

出於好奇該集合包含的元素是什麼? –

回答

3

如果你在一個類型集合實例使用@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>。一個可能的解決方案是在現場使用setter。或者,您可以使用@Qualifier註釋或@Resource註釋來按名稱引用bean。

+0

謝謝,@Resource做到了! – Vikdor