0

可以通过实现 ApplicationContextInitializer 并将 Spring 配置文件添加到环境中来动态加载 Spring 配置文件。

问题是,在我正在帮助的一个项目中,他们正在使用存储在数据库中的属性。如何从数据库加载表示其他活动 Spring 配置文件的属性,然后将其注入环境。在 ApplicationContextInitializer 中,我不能使用 Spring bean,因为应用程序上下文尚未完全初始化。对数据库的低级别访问是我唯一的选择吗?

4

1 回答 1

0

SpringPropertyPlaceholderConfigurer需要使用 location 属性进行初始化,该属性是您想要的属性文件。但是,这个类也可以用一个java.util.Properties对象来初始化。

从已弃用的项目 Spring-Modules 中,您可以在此处找到实现和Spring的此类,这样它的行为就像可以传递给方法的普通对象一样。InitializingBeanFactoryBeanjava.util.PropertiesPropertyPlaceholderConfigurer.setProperties()

通过这种方式,您可以利用org.apache.commons.configuration.DatabaseConfiguration类似于 Properties 对象但从数据库中读取属性的行为。例如,想想这个 bean 配置:

<bean 
    name="MyDatabaseConfiguration"
    class="org.apache.commons.configuration.DatabaseConfiguration">

    <constructor-arg type="javax.sql.DataSource" ref="someDataSource"/>
    <constructor-arg index="1" value="SCHEMA.PROPERTIES_TABLE"/>
    <constructor-arg index="2" value="KEY"/>
    <constructor-arg index="3" value="VALUE"/>
</bean>

这里,arg 1 是包含属性的表,arg 2 是键列,arg 2 是值列。

因此,您可以创建您的自定义类,非常类似于CommonsConfigurationFactoryBean并以这种方式使用:

<bean 
    name="PropertyPlaceholderConfigurer"     
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="properties" ref="MyCustomClass"/>
</bean>

MyCustomClass您将用于包装的类在哪里MyDatabaseConfiguration

希望能帮助到你。

于 2015-09-11T10:21:17.207 回答