spring 重载特定bean配置

本文介绍了一种在不重启服务器的情况下,如何利用XML配置、DOM4J、反射和Spring的AutowireCapableBeanFactory来重载并更新特定Bean的属性。主要步骤包括:1) 使用XML和注解混合配置Bean;2) 通过DOM4J读取XML中变更的属性值;3) 反射更新Bean的属性;4) 使用Spring工厂保存更新后的Bean。这种方法适用于需要动态调整Web服务连接参数的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:项目与外围系统通过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" class="com.gpms.module.eqm.webService.xfire.GpmsWebServiceRef">
	<property name="erpUrl" 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所对应的element
Element 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);

 

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

### 实现Spring Boot中的Bean动态刷新 为了使Spring Boot应用能够响应配置的变化并实时更新相应的Bean实例,可以采用特定的方法来实现Bean的动态刷新。当涉及到Bean的动态刷新时,`@RefreshScope` 注解扮演着重要角色[^2]。 对于希望在运行期间根据外部配置源(如Nacos、Config Server等)改变其属性值的对象来说,在定义这些对象作为Spring管理下的组件时加上 `@RefreshScope` 可以确保每次访问该类的新实例都会重新读取最新的配置数据[^3]。 下面是一个简单的例子展示如何创建一个支持动态刷新的Bean: ```java import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; @Component @RefreshScope public class ConfigurableService { private String message; public void setMessage(String message){ this.message = message; } public String getMessage(){ return message; } } ``` 为了让上述服务生效,还需要引入必要的依赖项以及正确设置配置文件以便于连接到远程配置中心,并开启对配置更改的支持。例如使用Nacos作为配置管理中心,则应在application.properties或yml中指定相应参数[^5]。 此外,如果想要更细粒度地控制某些特殊类型的Beans的行为,比如那些不是由框架自动生成而是手动注册至上下文内的单例模式实体,可以通过重载获取逻辑的方式达到目的——即每当请求此类资源时都强制执行一次初始化过程从而保证拿到最新版本的数据结构体。 最后值得注意的是,除了依靠第三方库提供的特性外,开发者也可以借助内置工具如Actuator端点来进行调试和验证工作;它不仅有助于排查问题还提供了丰富的接口用于查询当前系统的各项指标状况[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值