我在我的一个Spring配置文件中定义了以下属性文件:
<context:property-placeholder location="classpath:project.properties"/>
现在我想覆盖一些不属于类路径的外部属性文件中的一些属性。
让我说我的项目部署在某处,我需要进行一些动态配置更改。我不想更新容器中的项目代码库(tomcat或任何东西)。
1。)所以我需要一种方法,用我在外部属性文件中的最新更新来更新(覆盖)spring的已加载属性文件的值。
2。)如果有人也可以共享刷新预加载属性的方法,那将会很棒。
答案 0 :(得分:34)
因此,我需要一种方法,使用我在外部属性文件中的最新更新来更新(覆盖)spring的已加载属性文件的值。
您可以使用PropertyPlaceholderConfigurer。
这种方式如果你想使用context
命名空间
<context:property-placeholder location="classpath:yourClasspath.properties,file:/some/resource/path/filePropertiesToOverride.properites"/>
或者这样
<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:yourClasspath.properties</value>
<value>file:/some/resource/path/filePropertiesToOverride.properites</value>
</list>
</property>
</bean>
根据PropertiesLoaderSupport.setLocations(Resource[])
的javadoc...注意:在重叠键的情况下,在以后的文件中定义的属性将覆盖先前定义的文件的属性。因此,请确保最具体的文件是给定位置列表中的最后一个文件。
如果有人也可以共享刷新预加载属性的方法,那将会很棒。
目前您正在使用PropertyPlaceholderConfigurer
。由于PropertyPlaceholderConfigurer
是BeanFactoryPostProcessor
,它遍历bean定义(beans.xml
的对象表示)并替换属性字符串(例如$ {someProp})。之后,bean被实例化并初始化。因此,没有办法重新加载&#39;属性。
如果您想构建一个可以在运行时对属性更改做出反应的应用程序,还有更多需要考虑的事项:
至少我建议使用apache commons configuration。但它只是一个解决一些问题的框架,你仍然需要考虑上述问题的解决方案。
答案 1 :(得分:0)
在弹簧靴2中,它是
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
您可以在https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
中获取完整的详细信息