一般来说, 一个Bean的属性定义都在在启动之前配置好了. 比如一个ProxyClient
的Bean, 他的依赖服务URL在启动前就会设置好的. 然而有些场景就是, 这个ProxyClient
的属性需要在运行时改变, 比如依赖服务crash掉了, 需要寻找新的替代服务, URL属性当然也要更新. 那么如何在runtime修改spring的Bean属性呢 ?
访问 ApplicationContext
要修改某个Bean, 首先就要先获取这个Bean, 也即是首先要从应用的上下文ApplicationContext
找到这个Bean. ApplicationContext
有几种获取方式, 下面使用的是自动注入的方法.
// 注入到你的类中 |
获取和修改 Bean
有了ApplicationContext
, 我们就可以通过getBean(String name)
来获取我们想要的Bean. 假设有一个Bean定义如下:
<bean id="calculationBean" |
如上, 这个Bean的class声明是HessianProxyFactoryBean
,
applicationContext.getBean("calculationBean")
获取的只是class com.sun.proxy.$ProxyXX
对象
要获取到 FactoryBean (HessianProxyFactoryBean), 应该使用&
获取, 然后调用FactoryBean的各种set方法即可.即:
HessianProxyFactoryBean factoryBean = (HessianProxyFactoryBean) applicationContext.getBean("&calculationBean"); |
注意, 这是Bean属于singleton的情况, 而且并不安全, prototype类型和其他场景需要用另一种方式来实现, 下一篇博客继续。
参考
http://stackoverflow.com/questions/15328904/dynamically-declare-beans-at-runtime-in-spring