2011-12-15 2 views
1

私は、リソースの配列を注入したいと思うbeanを持っています。コンストラクタインジェクションのために複数の引数の中から1つだけを自動配線できますか?

org.springframework.core.io.Resource[] 

は実際には、InputStreamSourceの配列は十分でした。 、

public SomeClass(InputStreamSource[] sources); 

それが動作しないので、私はしぶしぶ

public SomeClass(InputStreamSource[] sources, ResourcePatternResolver resolver); 

を持っていることを選んだ。しかし、今:

私のコンストラクタだった
<bean id="..." class="com.usta.SomeClass"> 
    <constructor-arg value="classpath:somedir/*.xml"/> 
</bean> 

:私のようなものを見て、私のBean定義を望んでいましたApplicationContextResourcePatternResolver)をこのビーアにどのように注入できますか?コンストラクタインジェクションを介してn?あるいは、このコンストラクタ引数を自動配線するだけでいいですか?

私はSetter Injection(ResourceLoaderAware)がこれを解決すると知っていますが、私はコンストラクターインジェクションを可能な限り固執しています。

SomeClassリソースいくつかの初期化前;セッター注入で私は初期化を延期しなければならず、SomeClassのフィールドfinalの数を宣言することはできません。

+0

はあなたが@Autowiredとしてコンストラクタをマークしたことがありますか? –

+0

新しいPathMatchingResourcePatternResolver()を作成してみませんか? – mrembisz

+0

@mrembisz私は確かにそれを使用しています。しかし、なぜちょうどApplicationContextを注入するのではないかと考えました。私はリゾルバを一度使う必要があるだけなので、なぜ新しいものを作るのですか? –

答えて

1

これはあなたのために働く必要があります...

コンストラクタ:

public SomeClass(final Resource[] resources) { ... } 

構成:

<bean id="patternResolver" class="org.springframework.core.io.support.PathMatchingResourcePatternResolver" /> 

<bean id="..." class="com.usta.SomeClass"> 
    <constructor-arg value="#{patternResolver.getResources('somedir/*.xml')}" /> 
</bean> 
+0

私がmrembiszに持っていたのとまったく同じ応答:私は確かにそれを使用しています。しかし、なぜちょうどApplicationContextを注入するのではないかと考えました。私はリゾルバを一度使う必要があるだけなので、なぜ新しいものを作るのですか? –

+0

@ UstamanSangat私は理解していますが、ここでは "鶏と卵"の問題があると思います.ApplicationContextを構築する過程で、参照として持つコンストラクタを呼び出すことになります。おそらく、設定ファイルでApplicationContext自体を参照する簡単な方法がないように思われる理由です。 ApplicationContextAwareや自動配線を実装するなどの他のアプローチでは、クラスにSpring固有の参照が残っていたり、コンストラクタを含まない(最終的なインスタンスフィールドはありません)。だから私は別のパターンリゾルバオブジェクトを作成することはとても悪いとは思わない。 – RichW

+0

はい、それは説明します! –

関連する問題