spring 重载特定bean配置

背景:项目与外围系统通过webservice交换数据,webservice的url,用户名,密码可能会在项目部署后发生改变,但服务          器不能随便重启。

需求:在不重启服务器的前提下,将更改后的值设置到spring 管理对应的bean中,影响范围越小越好。

解决:1. 把承载webservice通信条件的bean使用xml配置文件方式+注解方式。;

         2. 使用dom4j获取xml配置文件中bean改变后的属性值

         3. 利用反射将获取的新值设置到原来的bean中

         4. 调用spring AutowireCapableBeanFactory 的方法将设置新值得bean保存起来。

 

代码:

1. bean xml配置文件:

 


	
	
	
	

 

 

2. 在tomcat 启动后将 erpUrl 值设置为 http://1.1.1.1:8080/services/gpmsWebService

 

3. dom4j 获取更改后的值

Document document =XmlUtils.getDocument(xmlPathName);
//获取bean所对应的element
Element element=XmlUtils.getElement(document, beanName);
//获取该bean所有的子property标签的name和值
List> list= XmlUtils.getProperties(element);

 beanName 为需重载bean的name或id

xmlPathName 为beanName 所在xml的路径

 

4. 利用反射,调用对应属性的set方法,将新值设置到获取出来的bean中

 

//获取容器中的bean对象,在将其值改变
Object obj=getApplicationContext().getBean(beanName);
//重新设置该bean所有新的值
for(Map 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);

 

总结:暂时只提供基本属性的重载,关联对象重载还没加入,需要进一步重构。可能有更好更方便的方法,只是找不到,不知道你们有什么好方法,大家贴出来,一起讨论一下。

你可能感兴趣的:(Spring)