spring runtime 修改 bean 属性

一般来说, 一个Bean的属性定义都在在启动之前配置好了. 比如一个ProxyClient的Bean, 他的依赖服务URL在启动前就会设置好的. 然而有些场景就是, 这个ProxyClient的属性需要在运行时改变, 比如依赖服务crash掉了, 需要寻找新的替代服务, URL属性当然也要更新. 那么如何在runtime修改spring的Bean属性呢 ?

访问 ApplicationContext


要修改某个Bean, 首先就要先获取这个Bean, 也即是首先要从应用的上下文ApplicationContext找到这个Bean. ApplicationContext 有几种获取方式, 下面使用的是自动注入的方法.

// 注入到你的类中
@Autowired
private ApplicationContext applicationContext;

获取和修改 Bean

有了ApplicationContext, 我们就可以通过getBean(String name)来获取我们想要的Bean. 假设有一个Bean定义如下:

<bean id="calculationBean"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl"
value="http://localhost:8080/calculation.http_wrong"></property>
<property name="serviceInterface" value="org.niko.opsrc.zk.znode.hessian.ifs.Calculation"></property>
</bean>

如上, 这个Bean的class声明是HessianProxyFactoryBean,

applicationContext.getBean("calculationBean")

获取的只是class com.sun.proxy.$ProxyXX对象

要获取到 FactoryBean (HessianProxyFactoryBean), 应该使用&获取, 然后调用FactoryBean的各种set方法即可.即:

HessianProxyFactoryBean factoryBean = (HessianProxyFactoryBean) applicationContext.getBean("&calculationBean");
factoryBean.setServiceUrl(newUrl);

注意, 这是Bean属于singleton的情况, 而且并不安全, prototype类型和其他场景需要用另一种方式来实现, 下一篇博客继续。

参考


http://stackoverflow.com/questions/15328904/dynamically-declare-beans-at-runtime-in-spring