2012-02-09 15 views
8

私はBeanとしてオートワイヤリングしているStringを持っています。 Stringの値はプロパティファイルを介して設定され、実行時にロードされます。それほど私は確認することができます。ここに私のXMLだ:Springで@Autowired String Beanの値を更新するにはどうすればよいですか?

<context:property-placeholder location="classpath:my-app.properties" /> 

<bean id="loadedProp" class="java.lang.String"> 
    <constructor-arg> 
     <value>${loaded-prop}</value> 
    </constructor-arg> 
</bean> 

そして、私のアプリケーションでは、私は豆にautowire:

@Component 
public class Foo { 

    @Autowired 
    private String loadedProp; 
} 

すべてがダンディに動作します。私はこのBeanにオートワイヤードする複数のコンポーネントを持っています。私がしようとしているのは、アプリケーションの実行中にBeanの値を何か他のものに更新することです。そのため、Beanは自動的に起動され、最新の値を使用します。これを行うことは可能ですか、値を変更するたびに再起動するだけですか?

+0

可能な複製http://stackoverflow.com/questions/2008175/apply-dynamic-properties-to-a-bean-at-runtime – beny23

+0

このリンクはあなたに役立ちますhttp://forum.springsource.org/archive /index.php/t-37557.html最後の投稿を見てください –

+0

@ beny23ああ、ありがとう。それは私の検索では立たなかった。 – Pat

答えて

3

他の回答やコメントを読んだ後、私は解決策を見つけ出すことができました。私は私のXMLファイルの更新

public class LPropBean { 

    private String loadedProp; 

    public LPropBean(String loadedProp) { 
     this.loadedProp = loadedProp; 
    } 

    // getters and setters... 
} 

<bean id="lPropBean" class="LPropBean"> 
    <constructor-arg> 
    <value>${loaded-prop}</value> 
    </constructor-arg> 
</bean> 

をし、Beanにautowire @Component Sのすべての更新:

@Autowire 
private LPropBean lPropBean; 

// ... later ... 
lPropBean.setLoadedProp(newProp); 

// ... later ... 
lPropBean.getLoadedProp(); 

私は」を、私は単純なクラスを作成することになりましたもっとエレガントな方法があると確信していますが、これは私がそれを必要としていた方法とまったく同じでした。

3

Stringは不変なので、その基礎となる値を変更して、参照を持つすべての人に更新させることはできません。

あなたはFooのインスタンスが異なるStringを指すように上に保持しているが、それだけであなたが更新され、特定のFooで作業しているオブジェクトによって実現されることをStringの参照を変更することができます。 FooがSpringシングルトンの場合、これは問題ではありません。

+0

Drat。だから、私はこれを回避するには、プロパティとしてStringを持つクラスをautowiringし、そのプロパティを更新することができますか?あるいは、私はまだ同じ罠に陥るだろうか? – Pat

+0

たとえば、apache.commonsのMutableObjectを使用し、おそらくgetter/setterを使用することができますか? –

+0

これは妥当と思われますが、私はまたコメントから来た提案のいくつかを見ていきます。ここでも、この 'String'を誰に与えたか、物事がSpring管理されているかどうかによって異なります。 –

0

設定を変更してスプリングインジェクション値を変更するたびに、コンテナを再起動する必要がありますサーバーを再起動します。

関連する問題