2

それ自体がであるクラスで、java.util.HashSetタイプのメンバーに空を注入しようとしているアプリケーションがあります。Springは、包含タイプの1つの要素を注入しているようです。Springが空のセットを注入しない理由はありますか?java.util.Set@ComponentHashSet

要素クラスを設定します。

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

}
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 に答える