可以通过实现 ApplicationContextInitializer 并将 Spring 配置文件添加到环境中来动态加载 Spring 配置文件。
问题是,在我正在帮助的一个项目中,他们正在使用存储在数据库中的属性。如何从数据库加载表示其他活动 Spring 配置文件的属性,然后将其注入环境。在 ApplicationContextInitializer 中,我不能使用 Spring bean,因为应用程序上下文尚未完全初始化。对数据库的低级别访问是我唯一的选择吗?
可以通过实现 ApplicationContextInitializer 并将 Spring 配置文件添加到环境中来动态加载 Spring 配置文件。
问题是,在我正在帮助的一个项目中,他们正在使用存储在数据库中的属性。如何从数据库加载表示其他活动 Spring 配置文件的属性,然后将其注入环境。在 ApplicationContextInitializer 中,我不能使用 Spring bean,因为应用程序上下文尚未完全初始化。对数据库的低级别访问是我唯一的选择吗?
SpringPropertyPlaceholderConfigurer
需要使用 location 属性进行初始化,该属性是您想要的属性文件。但是,这个类也可以用一个java.util.Properties
对象来初始化。
从已弃用的项目 Spring-Modules 中,您可以在此处找到实现和Spring类的此类,这样它的行为就像可以传递给方法的普通对象一样。InitializingBean
FactoryBean
java.util.Properties
PropertyPlaceholderConfigurer.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
。
希望能帮助到你。