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