次は少し奇妙ですが動作します。 reconfigurable
という名前のcustom scopeを作成すると、構成の更新が発生するたびに、そのスコープで作成されたすべてのBeanがスローされます。したがって、設定変更後に新しいBeanが作成されます。
通常の$ {}構文とPropertyOverrideConfigurerの両方の値がBeanDefinitionで永続的に固定されているように見えるため、実際の構成値はスプリング式言語で取得する必要があります。スコーププロキシこのBeanを使用する豆は、常にカスタム範囲から新鮮構成された豆を取り出すよう:あなたは、AOPを使用する必要が
<bean class="blablu.Testbean" scope="reconfigurable"
p:someProperty="#{ config['configexplicit']}">
<aop:scoped-proxy />
</bean>
:再構成可能なプロパティsomeProperty
を持つBeanのBean宣言は次のようになります。
@Value
でプロパティを宣言することもできます。あなたがコンポーネントのスキャンを使用する場合は、あなたが細部の世話をした場合、注釈
@Scope(value="reconfigurableScope", proxyMode=ScopedProxyMode.TARGET_CLASS)
とスコープを宣言する必要があります:
public class ReconfigurableScope implements Scope {
private final Map<String, Object> nameToObjectMap = new ConcurrentHashMap<String, Object>();
public Object get(final String name, final ObjectFactory<?> objectFactory) {
Object bean = nameToObjectMap.get(name);
if (null == bean) {
bean = objectFactory.getObject();
nameToObjectMap.put(name, bean);
}
return bean;
}
// called from outside on each configuration change
public void update(final ConfigurationObservable observable, final Object arg) {
nameToObjectMap.clear();
}
}
プラスいくつかのスレッドの安全性とクリーンアップのもの:スコープの基本的な考え方は次のとおりです。削除されたBeanは、少し後で、アプリケーションコンテキストの終了時に破棄する必要があります。
おそらく、それを行う方法は、PropertyOverrideConfigurer http://stackoverflow.com/a/595201/21499を使用することですが、プロパティのオーバーライドの仕組みは使いにくく、エラーが発生しやすいと思います。 –