13.1. 2.6.33 版本起开始支持
主要升级点
当使用以 -jar 方式启动的程序(非tomcat,web方式)时,例如 springboot 时,可以无缝对接(不会出现配置文件找不到的情况)
正确的使用方式
<!-- 使用托管方式的disconf配置(无代码侵入, 配置更改会自动reload)-->
<bean id="configproperties_disconf"
class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath*:autoconfig.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurer"
class="com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="propertiesArray">
<list>
<ref bean="configproperties_disconf"/>
</list>
</property>
</bean>
细节
在未升级前,要使用spring-boot,我们的配置可能是这样的
<!-- 使用托管方式的disconf配置(无代码侵入, 配置更改会自动reload)-->
<bean id="configproperties_disconf"
class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">
<property name="locations">
<list>
<value>file:autoconfig.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurer"
class="com.baidu.disconf.client.addons.properties.ReloadingPropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="propertiesArray">
<list>
<ref bean="configproperties_disconf"/>
</list>
</property>
</bean>
注意,我们使用 file:autoconfig.properties
而不是 classpath*:autoconfig.properties
。这是为什么呢?
当以-jar 的方式启动服务时,classpath可能会找不到,spring读取配置的原则是:
- classpath*:autoconfig.properties : 只能读取jar包内的配置文件
- file:autoconfig.properties : 读取的当前路径下的配置文件
当以java入口类 的方式启动服务时,classpath一定是WEB-INF/classes或者target/classes目录下,spring读取配置的原则是:
- classpath*:autoconfig.properties : 读取的WEB-INF/classes或者target/classes目录下的配置文件
- file:autoconfig.properties : 读取的是当前路径下的配置文件
在以-jar方式启动时,原则上,我们希望将配置文件放在jar包外面,所以这里采用了 file:autoconfig.properties
,当以这种方式启动程序时,disconf将配置下载到当前路径下,程序可以找到配置,不会报错。
但当你使用IDE(eclipse or intellij)启动时,它就报错了,说配置文件找不到了。这是因为IDE启动时,不是以-jar的方式启动的,它是以Java入口类的方式进行启动的,disconf将配置下载到target/classes
目录下,如果还是使用 file:autoconfig.properties
,程序在当前路径下是无法找到的。
这就产生了一个问题:我在IDE调试时,必须使用 classpath*:autoconfig.properties
,当以命令行启动时,必须使用 file:autoconfig.properties
本次升级就是为了避免这个问题。未来配置统一是classpath*:autoconfig.properties
。原理是,在以-jar启动时,通过将当前路径设置为classpath,程序启动后,disconf将配置下载到当前路径,通过读取classpath进行读取配置,就可以找到这个配置了。
版权声明:「DDKK.COM 弟弟快看,程序员编程资料站」本站文章,版权归原作者所有
来源:https://disconf.readthedocs.io/zh_CN/latest/index.html