虽然注解式编程简单、直观,易维护,但是,它是具有一定的代码侵入性的。disconf考虑到有些用户不想写代码,只想通过XML配置(可能是在旧项目中使用disconf)来实现分布式配置的需求。因此,disconf亦实现了基于XML分布式的实现方式。
ReloadablePropertiesFactoryBean实现了配置文件的disconf托管
ReloadablePropertiesFactoryBean继承了PropertiesFactoryBean类,它主要做到:
- 托管配置文件至disconf仓库,并下载至本地。
- 解析配置数据传递到 ReloadingPropertyPlaceholderConfigurer
ReloadingPropertyPlaceholderConfigurer实现了配置数据至Bean的映射
ReloadingPropertyPlaceholderConfigurer继承自Spring的配置类PropertyPlaceholderConfigurer,它会在Spring启动时将配置数据与Bean做映射,以便在检查到配置文件更改时,可以实现Bean相关域值的自动注入。
ReloadConfigurationMonitor 定时校验配置是否更新
它是一个Timer类,定时校验配置是否有更改,进而促发 ReloadingPropertyPlaceholderConfigurer 类来分析要对哪些 Bean实例进行重新注入。
在多人开发情况下,可能会有一两个配置文件需要经常改动,且每个人的配置都不大一样,在这种情况下,当然希望此配置文件(或多个配置) 均不要使用Disconf托管。
Disconf考虑到了此种情况。举个实例,数据库配置文件,每个人的数据库可能不大一样,那么,你可以修改 disconf.properties :
# 忽略哪些分布式配置,用逗号分隔
ignore=jdbc-mysql.properties
将此配置文件添加到ignore的列表里。这样,程序运行时,Disconf就会忽略托管此配置文件,而改为读取你本地的配置文件 jdbc-mysql.properties。
如果想配置文件,但是不想自动reload,那么该怎么办?
可以使用以下与本方法非常相似的做法:
<!-- 使用托管方式的disconf配置(无代码侵入, 配置更改不会自动reload)-->
<bean id="configproperties_no_reloadable_disconf"
class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
<property name="locations">
<list>
<value>myserver.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurerForProject1"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="propertiesArray">
<list>
<ref bean="configproperties_no_reloadable_disconf"/>
</list>
</property>
</bean>
在这里,myserver.properties被disconf托管,当在disconf-web上修改配置文件时,配置文件会被自动下载至本地,但是不会reload到系统里。