职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1065|回复: 3

如果动态的更新spring中的某些值

[复制链接]
叫我小乖 发表于 2011-9-3 10:33 | 显示全部楼层 |阅读模式
1、背景
   我们的很多项目都是使用spring管理各种对象的生命周期。spring可以通过重新load/refresh applicationContext来刷新管理的对象。但是,这样是有风险的,refresh过程存在空档期。进一步,如何做到只刷新部分对象,或者是某些特定的资源呢?
更特别的是,如果保持原有对象的引用,只是刷新某些属性值的?例如线程池参数。

2、分析
   2.1 常见的做法是再起一个applicationcontext,加载整个新的配置文件组,然后替换掉当前的context。这样做无疑代价很大。而且对现在正在使用并没有释放的资源,存在风险。
   一个可以考虑的方式是,在applicationcontext之上,再封装一层包装器或者classloader,标记状态,如果一个对象被更新,则标记旧对象为失效,并将新的引用都指向新的资源。同时用另外的线程探测,在旧对象任务完成后,销毁掉旧的对象。这些解决了上面的问题,但是还是很麻烦。
   2.2 context上想办法其实都是很“重”的方案,配置层面上,可想的方案也有一个,bean的factory可以指定classloader,这样的话,实现一个自己的classloader,根据条件判断或者接到通知时,修改bean的数据信息,这个对于单个的bean的修改是个可用的办法,但是细节上依赖一个classloader和一个显示的factory。
   2.3 从context到配置的修改,然后呢,在另一个层面上,在bean的解析定义阶段,组装bean或者bean的属性值,也是一个不错的方案,对于局部刷新bean的值,是个好方案。主要是自定义parser,然后是:BeanDefinition和BeanFactoryPostProcessor,PropertyPlaceholderHelper。具体的可以用properties文件或者xml来表示需要更新的属性的键值对,然后和bean的id对应起来,需要更新的时候,先使用properties来load数据或者是xmlbeans解析xml到map或pojo对象,然后map或pojo把属性和值填充到Bean实例即可。




gz-vps 发表于 2011-9-3 10:33 | 显示全部楼层
lz说的应该是动态加载吧,可以参考JRebel及其spring插件

醉倚西风 发表于 2011-9-3 10:34 | 显示全部楼层
重新加载BEAN肯定存在空档期. 弄不好还死锁呢.
重新加载BEAN一般情况下是重新加载初始数据,
建议把这种业务放在BEAN的内部缓存中.


jinchang 发表于 2011-9-3 10:34 | 显示全部楼层
修改value简单的,直接set到field里不就行了,可以把xml也顺便重写下

难道要修改ref?其实ref也是value,一样的方法解决
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-3 15:02 , Processed in 0.146865 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表