数据库中的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