8

Spring で、あるタイプのすべての Bean とそのサブタイプのいずれかをリストに自動入力する方法はありますか? 次のようなセッターメソッドがあります。

setMyProp(List<MyType> list)

そして、MyType の任意の Bean と MyType のすべてのサブクラスで自動配線したいと思います。

ありがとう、ジェフ

4

5 に答える 5

26

うん、あなたはこれを行うことができます。春のドキュメントは言う:

特定のタイプの配列を期待するフィールドまたはメソッドにアノテーションを追加することにより、ApplicationContext から特定のタイプのすべての Bean を提供することもできます。

リストではなく配列を期待する必要があると書かれていることに注意してください。ジェネリック型の消去は、リストが実行時に機能しない可能性があることを意味するため、これは理にかなっています。ただし、次の単体テストを行ってください。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  

    <bean class="test.Test.TypeB"/>
    <bean class="test.Test.TypeC"/>
    <bean class="test.Test.TypeD"/>
</beans>

そしてこの単体テスト:

package test;

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {

    private @Autowired List<TypeA> beans;

    @org.junit.Test
    public void test() {
        assertNotNull(beans);
        assertEquals(2, beans.size());
        for (TypeA bean : beans) {
            assertTrue(bean instanceof TypeA);
        }
    }       

    public static interface TypeA {}
    public static class TypeB implements TypeA {}
    public static class TypeC extends TypeB {}
    public static class TypeD {}

}

TypeA[]したがって、公式には、 ではなくautowire を使用することになっていますList<TypeA>が、リストはうまく機能します。

于 2009-09-20T08:55:21.140 に答える
5

Bean 定義ファイル内からではなく、アプリケーション コードからリストを埋めることが許容される場合は、 を使用しorg.springframework.beans.factory.xml.XmlBeanFactoryて " " と尋ねることができますgetBeansOfType( MyType.class )。これにより、 のタイプ (およびサブタイプ) のすべての Bean が得られますMyType

于 2009-09-20T07:56:35.830 に答える
3

コード内で使用できる場合は @Autowired、skaffman が言及した方法を安全​​に使用できます。XML 構成を主張する場合は、これを実現するためのHeraという小さなライブラリがあります。あなたが説明したシナリオの基本的な構成は次のようになります。

<bean id="client" class="..">
    <property name="injectDynamicListHere">
        <hera:list class="my.custom.SuperType" />
    </property>
</bean>

SuperTypeこれにより、 asを実装するすべてのトップレベルの Spring BeanListがクライアント Bean に注入されます。

于 2009-09-22T12:28:56.200 に答える
0

短い答え:いいえ。

長い答え: Java ジェネリックは型消去によって機能します。つまり、実行時にそのパラメーターは単なるリストであり、ジェネリック型のリストではありません。そのため、パラメーターの型が MyType であることを意図していることを理解できないため、この動作を実装することはできません。

そうは言っても、これを行う別の方法があります。最も明白なのは、Bean の作成をリッスンし、それらが MyType (またはサブクラス) であるかどうかを確認し、参照を保持することです。

これを行うには、おそらくいくつかの方法があります。1 つはBean ポスト プロセッサの作成です。このようにして、作成されたすべての Bean の通知を受け取ります。

于 2009-09-20T02:53:01.613 に答える