質問
私は自動タイプとそのサブタイプのいずれかの豆のすべてのリストを読み込むことができ春方法はありますか?私は次のようになりますsetterメソッドを持っています:
setMyProp(List<MyType> list)
そして、私はがMyTypeのいずれかの豆がMyTypeのすべてのサブクラスでautowireしたいと思います。
おかげで、 ジェフ
解決
うん、あなたがこれを行うことができます。春のドキュメントは言う:
すべてを提供することも可能です から特定の種類の豆 追加することにより、ApplicationContextの そのフィールドやメソッドへの注釈 その型の配列を期待します。
それはあなたが、配列ではなく、リストを期待する必要があると述べていることに注意してください。ジェネリック型消去は、リストが実行時に動作しないことが意味するので、これは理にかなっています。しかし、働く、以下のユニットテストを受けます:
<?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[]
ない、List<TypeA>
をautowireすることになっていますが、リストには良い作品だ。
他のヒント
あなたはorg.springframework.beans.factory.xml.XmlBeanFactory
を使用することができますし、「getBeansOfType( MyType.class )
」それを聞いて。これは、あなたMyType
のタイプ(およびサブタイプ)のすべての豆を与えます。
あなたが移入するコードの中@Autowired
を使用することができます場合は、安全にskaffmanで述べた方法を使用することができます。あなたは、XML構成を主張する場合は、これを達成するためにヘラに呼ばれる小さなライブラリがあります。自分で説明したシナリオのEsentially構成は次のようになります:
<bean id="client" class="..">
<property name="injectDynamicListHere">
<hera:list class="my.custom.SuperType" />
</property>
</bean>
これは、クライアントBeanにSuperType
としてList
を実装するすべてのトップレベルのSpring Beanを注入します。
短い答え:いいえ。
長い答え:Javaのジェネリックは、実行時にパラメータが単にリストではなく、一般的なタイプのリストであるということを意味し、型消去することによって動作します。そのようにあなたはこの動作を実装することはできないので、パラメータの型がMyTypeであることを意味することを理解することはできません。
言われていること、これを実行する別の方法があります。最も明白な参照を保ち、彼らががMyType(またはサブクラス)である場合に見て、その後、豆の作成のために聞くとすることのようです。
おそらくこれを行うにはいくつかの方法があります。一つは、はビーンポストプロセッサを作成していますに。この方法は、あなたが作成していますすべての豆の通知を取得します。
により、レガシーコードと行方不明@Autowiredに私は次のようにそれを解決します:
MyBean implements ApplicationContextAware{
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
final Map<String, HttpRequestHandlerTemplate> beansOfType = ctx.getBeansOfType(RequiredBean.class);
...
}