2016-04-05 4 views
0

実行時にwebserviceによっていくつかのSpring Beanを変更する必要があります。私はApplicationContextを使っています。私@Configurationクラスの実行時にApplicationContextを使用してプログラムでSpring Beanを変更する

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)applicationContext; 

ConfigurableListableBeanFactory registery = configContext.getBeanFactory(); 

registery.registerSingleton("XXX", new MyNewBeanDefintion()); 

は単に

public interface ParentClass { 

public Item selectOneItem(); 

} 

public class X implements ParentClass { 

@Override 
public Item selectOneItem() { 
// return item 
} 

}

public class Y implements ParentClass { 
@Override 
public Item selectOneItem() { 
// return item 
} 
} 

@Bean 
public ParentClass campaignSelection(){ 
if(type.equals("X")) { 

return new X(); 

} 
else if(type.equals("Y")){ 

return new Y(); 
} 

    return null; 

} 

があり、私はXを切り替えるために豆を必要とする必要があります、実行時のY

+0

プロパティ値の変更、更新などはどういう意味ですか?対象豆の範囲は? – Evgeny

+0

@Evgenyは、Beanの注入された値を更新します。 – Hoda

答えて

1

注入されたcampaignSelectionのインスタンスを置き換えるには、マーカーインターフェイスを使用できます。

public interface CampaignChangeAware {  
    void onCampaignChange(ParentClass newCampaign); 
} 

更新する必要がある他のクラスをこのインタフェースを実装するようにします。そして、あなたは、コード

Map<String, CampaignChangeAware> beansToUpdate = context.getBeansOfType(CampaignChangeAware.class); 
for (CampaignChangeAware bean : beansToUpdate.values()) { 
    bean.onCampaignChange(newCampaign); 
} 

を使って豆を更新することができるようになります。しかし、それは春のようにsingletonは、このような豆を管理していないこと、他の範囲で既にインスタンス豆には影響を与えません。

+0

しかし、どうすればよいですか? @Autowired private ParentClass parentClass; – Hoda

+0

@Hoda通常通り使用してください。 Beanが作成されるとき、Springは必要なインスタンスを挿入します。 Beanを更新する必要があるときは、挿入されたインスタンスを 'onCampaignChange'メソッドで置き換えます。つまり、' parentClass = newCampaign'です。新しいBean(プロトタイプスコープ付き)の場合は、コード '@Bean public ParentClass campaignSelection()'が完璧に機能し、目的のタイプを置き換えます。たとえば、いくつかの静的クラスを使用して現在の型を保持することができます – Evgeny

関連する問題