我们的团队之一以这种方式实现了加载属性(请参阅下面的伪代码)并建议这种方法是正确的,因为使用它的客户端应用程序可以自由地将属性保存在任何文件中。与广泛使用的propertyplaceholderconfigurer相反。
<bean class="com.mypackage.Myclass">
<property name="xml" value="classpath:"{com.myapp.myproperty1}"> </property>
</bean>
config.properties
com.myapp.myproperty1=data.xml
编辑:我应该添加的是data.properties而不是data.xml。我们想要加载一个属性文件(这个属性文件在config.properties中作为“属性”给出。 com.myapp.myproperty1 = data.properties
import org.springframework.core.io.Resource;
public class Myclass {
private Resource xmlField;
// setter & getter methods..
}
使用spring core.io.Resource是否正确?
另一个原因是客户端应用程序想要加载特定于环境的配置。我建议使用propertyconfigurer并使用maven配置文件生成特定于环境的构建
请告知哪一个适合哪种情况?如果它在不同情况下有所不同,请帮助我指出它们吗?
感谢
答案 0 :(得分:10)
您可以将属性放在任何文件中,但仍然使用PropertyPlaceholderConfigurer
。这是一个满足您的同事关注点和您对环境特定事物的渴望的示例:
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- default settings -->
<value>classpath:MyCompany.properties</value>
<!-- environment-specific settings -->
<value>classpath:MyCompany.${mycompany.env:dev}.properties</value>
<!-- keep your coworker happy -->
<value>classpath:${mycoworker}</value>
<!-- allows emergency reconfiguration via the local file system -->
<value>file:///${user.home}/MyCompany.properties</value>
</list>
</property>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="ignoreResourceNotFound" value="true" />
<!-- should be validated separately, in case users of the library load additional properties -->
<property name="ignoreUnresolvablePlaceholders" value="false"/>
</bean>
如果您没有传递-D
个参数,那么您将获取以下属性文件,其中后面文件中的属性会覆盖先前确定的值。
要在#2的生产配置中交换,只需将-Dmycompany.env=prod
传递给java。同样,如果他/她想要,您的同事可以通过-Dmycoworker=/some/path/config.properties
。
答案 1 :(得分:5)
我不确定为什么PropertyPlaceholderConfigurator
不是正确的选择。
我几乎总是通过自定义PPC处理特定于环境的配置,该PPC可以(a)在启动时获得-D
参数,和/或(b)使用机器名称来决定哪个属性文件加载。
对我来说,这比通过Maven捆绑信息更方便,因为我可以更轻松地从我所使用的任何机器上测试任意配置(使用-D
属性)。
答案 2 :(得分:3)
+1戴夫的建议。您应该使用PropertyPlaceholderConfigurer来加载\读取属性。如果你想知道如何使用它,我刚刚从我之前的项目中提取的示例。此示例用于加载多个属性文件,但概念相同。祝你好运。
<bean id="projectProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:config.properties</value>
</list>
</property>
</bean>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="projectProperties" />
</bean>
<bean id="uniqueAssetIdRetriever" class="com.mypackage.Myclass">
<property name="xml" value="${com.myapp.myproperty1}" />
</bean>