2010-11-19 12 views
0

私はSpring 3を使用してWebアプリケーションを作成していますが、Spring Expression Languageの機能を利用したいが問題に陥っている。私は自分のBeanの1つのプロパティの値を別のBeanのメソッド呼び出しの結果に設定する必要があります。私はこれを行うことができますが、問題は、そのメソッド呼び出しの結果は、Beanが初期化された後に変更される可能性があり、変更を反映するためにそのプロパティが必要なことです。例えば:SpELを使用してSpring Beanプロパティの値を更新します

<beans> 
... 
<bean name="guestList" class="java.util.ArrayList"></bean> 

<bean name="party" class="some.custom.class.Party"> 
    <property name="numberOfGuests" value="#{guestList.size()}" /> 
</bean> 
... 
</beans> 

私が言うことができるものから、numberOfGuestsフィールドはpartyフィールドがアクセスされた最初の時間に設定されています。しかし、partyフィールドにアクセスした後、ゲストの人数が変更される可能性があります。これを反映するには、numberOfGuestsフィールドが必要です。値を更新する必要があるときはいつでも、私のアプリケーション内のnumberOfGuestsフィールドを再初期化する方法はありますか?

これは単なる一例であり、直接guestList Beanにアクセスすると、私の特定の状況では動作しません。

答えて

2

あなたは、あなたのBeanをするたびにスプリング負荷のプロトタイプを作成するためにあなたの範囲を設定した場合、それはゲストリストのサイズを再計算する必要があります

<bean name="party" class="some.custom.class.Party" scope="prototype"> 

ので、partyが原型となったがguestListは、デフォルトのスコープでシングルトン(滞在することができます)。

キャッチは、しかしあります:あなたは(シングルトンである)partyHostのような別のBeanを、持っている、そしてそれは(プロトタイプがある)partyを注入してしまった場合partyHostであるため、partyHostは、partyの別のインスタンスを取得することはありませんシングルトンに依存し、一度それに注入された依存関係のみを取得します。これがうまくいくためには、更新されたゲストリストサイズを必要とするすべてのBean、およびそれらを参照するBeanのすべてがプロトタイプでなければなりません。

いずれか、またはAPIを介してSpringに直接問い合わせる必要があります。 APIを使用する場合、いつでも呼び出すことができ、プロトタイプBeanの新しいインスタンス、したがって更新されたゲストリストのサイズを取得できます。

applicationContext.getBean("myPrototype"); 

可能であれば、Spring APIを避ける方がよいでしょう。通常、開発者はDIフレームワークに結合されることを望んでいません。

0

#の例{guestlist.sizeは()}のみプロパティの初期値ではなく、最新に保つためのポリシーを設定します。遅延読み込みを使用していないと仮定すると、Springは起動時にSpringのマネージドBeanをアプリケーションコンテキストからインスタンス化します。その時点から、プロパティ値の更新を処理するのは開発者次第です。

0

私は最も簡単な、すなわち、Beanにリスト(guestList)を注入し、あなたがnumberOfGuestsを必要とするたびJavaコードから手動でその.size()メソッドを呼び出すことであろう推測:

package some.custom.class; 

public class Party { 
    private List<?> guestList; 
    // getter & setters 

    public int getNumberOfGuests() { 
    return guestList!=null ? guestList.size() : 0; 
    } 

} 

と...

<bean name="party" class="some.custom.class.Party"> 
    <property name="guestList" ref="guestList"/> 
</bean> 
+0

これは間違いなくそれを行うための最も簡単な(および優先!)方法ですが、OPは「これは単なる一例であり、直接guestList Beanにアクセスすると、私の特定の状況では動作しません。」と述べました –

+0

あなたは正しいです。撮影ポイント。間違いなくもっと情報が必要です。 'guestList' beanへの直接アクセスで何が問題になりますか? –

関連する問題