我正在开发一个应用程序库,其中包含一个名为“Config
”的实用程序类,它由 Spring Environment
对象支持,并为所有应用程序提供强类型的 getter配置值。
配置的属性源可能因环境(DEV/PROD)和使用情况(独立/测试/webapp)而异,范围可以从默认属性(系统和环境属性)到自定义数据库和 JNDI 源。
我正在苦苦挣扎的是如何让使用这个库的应用程序轻松配置 Environment
使用的属性源,以便这些属性可以在我们的 中使用Config
类并通过 PropertySourcesPlaceholderConfigurer
。
我们仍在使用 XML 配置,因此理想情况下,这可以在 XML 中进行配置。
<bean id="propertySources" class="...">
<property name="sources">
<list>
<ref local="jndiPropertySource"/>
<ref local="databasePropertySource"/>
</list>
</property>
</bean>
...然后以某种方式注入(inject)到 Environment 的属性源集合中。
我了解到,由于应用上下文生命周期的时间安排,这样的事情可能是不可能的,这可能需要使用应用程序初始化程序类来完成。
有什么想法吗?
最佳答案
这取决于您希望如何使用属性,如果是使用 ${propertyname}
语法注入(inject)属性,那么是的,只需使用 PropertySourcesPlaceHolderConfigurer 即可,它在内部可以访问 PropertySources在环境中注册。
如果您打算直接使用 Environment,例如使用 env.getProperty()
,那么您是对的 - 使用 PropertySourcesPlaceHolderConfigurer 的属性在此处不可见。唯一的方法是使用 Java 代码注入(inject)它,我知道有两种方法:
一个。使用 Java 配置:
@Configuration
@PropertySource("classpath:/app.properties")
public class SpringConfig{
}
b.使用自定义 ApplicationContextInitializer ,它的描述方式here
关于Spring环境属性源配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416005/