spring 重载特定bean配置
背景:项目与外围系统通过webservice交换数据,webservice的url,用户名,密码可能会在项目部署后发生改变,但服务 ? ? ? ? ?器不能随便重启。
需求:在不重启服务器的前提下,将更改后的值设置到spring 管理对应的bean中,影响范围越小越好。
解决:1. 把承载webservice通信条件的bean使用xml配置文件方式+注解方式。;
? ? ? ? ?2. 使用dom4j获取xml配置文件中bean改变后的属性值
? ? ? ? ?3. 利用反射将获取的新值设置到原来的bean中
? ? ? ? ?4. 调用spring?AutowireCapableBeanFactory 的方法将设置新值得bean保存起来。
?
代码:
1. bean xml配置文件:
?
<bean id="GpmsWebServiceRef" value="http://1.2.2.2:8080/services/gpmsWebService"></property><property name="authen" value="1"></property><property name="userName" value="test"></property><property name="password" value="test"></property></bean>
?
?
2. 在tomcat 启动后将?erpUrl 值设置为 http://1.1.1.1:8080/services/gpmsWebService
?
3. dom4j 获取更改后的值
Document document =XmlUtils.getDocument(xmlPathName);//获取bean所对应的elementElement element=XmlUtils.getElement(document, beanName);//获取该bean所有的子property标签的name和值List<Map<String,String>> list= XmlUtils.getProperties(element);
?beanName 为需重载bean的name或id
xmlPathName 为beanName 所在xml的路径
?
4. 利用反射,调用对应属性的set方法,将新值设置到获取出来的bean中
?
//获取容器中的bean对象,在将其值改变Object obj=getApplicationContext().getBean(beanName);//重新设置该bean所有新的值for(Map<String,String> map : list){String methodName="set"+map.get("name").substring(0,1).toUpperCase()+map.get("name").substring(1);//获取该属性的属性对象Field field =FieldUtils.getField(obj.getClass(), map.get("name"), true);//获取set方法,参数类型为属性的类型Method method=RefUtils.getMatchingAccessibleMethod(obj.getClass(), methodName,new Class[]{field.getType()});//设置值RefUtils.invokeMethod(obj, methodName, new Object[]{map.get("value")}, method.getParameterTypes());}5. 将拥有新值得bean更新到spring容器中:
?
AutowireCapableBeanFactory acbf=getApplicationContext().getAutowireCapableBeanFactory();acbf.autowireBean(obj);acbf.initializeBean(obj, beanName);
?
总结:暂时只提供基本属性的重载,关联对象重载还没加入,需要进一步重构。可能有更好更方便的方法,只是找不到,不知道你们有什么好方法,大家贴出来,一起讨论一下。