数据库中的Spring配置
我们有一个部署了120次的应用程序,每个应用程序的配置略有不同。 我们希望将配置存储在数据库中以进行审计和管理。
如何在不使用XML的情况下直接从数据库中实例化Spring bean?
谢谢
你不能没有零配置(除非你使用JavaConfig,在你的情况下不会有所不同)。 您可以将其中一些外部化到数据库,并使用自定义PropertyPlaceholderConfigurer
。 请参阅有关如何实现此目的的文章 。
@Bozho的建议几乎肯定是最实用的解决方案,特别是如果部署之间的差异很小并且可以通过简单的标量属性表达。
另一种方法是编写自己的BeanFactory
实现。 这是一项非常重要的练习,您希望确保它是您所需要的。 一个好的起点是查看XmlBeanFactory
的源代码,然后编写自己的(可能是DatabaseBeanFactory
),它执行类似的操作,但是从数据库中获取bean定义,而不是从本地XML文件中获取。
不过,这将是相当多的额外工作。
在Web应用程序的情况下:
编写自定义ServletContextListener实现,在应用程序启动时使用数据库值填充Properties实例,并将其传递给Spring的PropertyPlaceholderConfigurer。 有关完整的工作示例,请参阅此文章: http : //blog.javaforge.net/post/31720600427/configuring-spring-based-web-application-from-database
有一些选项比skaffman的建议更简单:
-
如果您的配置以XML格式存储在数据库中,则可以通过重写
AbstractApplicationContext.getResource()
来实现自定义资源获取策略,以便可以从数据库加载XML配置。 请参阅此处获取一些示例代码。 使用此方法,您还可以动态生成XML配置。 -
如果您的配置存储在“反汇编”表单中,则可以使用以下方法之一构建
BeanDefinition
并在上下文初始化期间将它们添加到BeanDefinitionRegistry
:- 实现命名空间扩展
- 实现
BeanFactoryPostProcessor
(您需要将ConfigurableListableBeanFactory
向下转换为BeanDefinitionRegistry
,它适用于大多数应用程序上下文类型) - 从Spring 3.0.1开始,之前的方法通过引入
BeanDefinitionRegistryPostProcessor