使用ApplicationContext在运行时以编程方式修改spring bean

时间:2016-04-05 12:10:05

标签: java spring

我需要通过webservice在运行时修改一些spring bean。我正在使用ApplicationContext。

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)applicationContext;

ConfigurableListableBeanFactory registery = configContext.getBeanFactory();

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

在我的@Configuration类中有

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

return new X();

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

return new Y();
}

    return null;

}

只需

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在运行时间在X,Y之间切换

1 个答案:

答案 0 :(得分:1)

要替换注入的campaignSelection bean实例,您可以使用标记接口,例如

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

使其他必须更新的类实现此接口。然后,您将能够使用代码

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

但它不影响已经实例化的bean,其范围是singleton,因为spring不管理这样的bean。