如何连接到BeanFactoryPostProcessor内的数据库?

时间:2014-10-06 08:46:06

标签: java database spring runtime-configuration

我正在使用Spring Data JPA(在Tomcat 7上)开发一个项目。我正在实施BeanFactoryPostProcessor来动态创建我的DataSource。但问题是我的DataSource信息(名称,网址等)存储在数据库本身。

@Component 
class DatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 

  // This doesn't work
  @Autowired DatabaseService databaseService;

  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // my code here ...
    // ...
  }
}

正如您所看到的,我正在尝试注入一项服务,该服务可以从我的数据库中获取所有DataSource的列表,但它不起作用。无论如何要连接到数据库并在BeanFactoryPostProcessor类中获取该列表?任何其他解决方法都将受到欢迎。 :)

1 个答案:

答案 0 :(得分:0)

BeanFactoryPostProcessor是Spring中一种非常特殊的概念。它们是在BeanDefinition个实例上运行的组件,它们是要创建的bean实例的元模型

这意味着,在调用BFPP的时间点,由于元模型即将进行后处理(顾名思义),因此尚未创建任何bean实例。因此,BFPP所依赖的bean将在容器的生命周期的早期初始化。因此,强烈建议不要依赖于来自BFPP的应用程序组件,或者 - 如果确实需要 - 仅依赖于不一定会触发创建大量下游组件的bean。

也就是说,您不应该依赖BFPP的特别存储库,因为它们通常需要创建大量基础架构组件。我建议获取连接到配置数据库所需的配置属性(JDBC URL,用户名,密码等),然后创建一个仅用于创建新{{1}的丢弃DataSource对于最终将由应用程序使用的新BeanDefinition

所以这里是建议的步骤(从我的头脑 - 可能需要一些调整):

  • 放弃DataSource
  • 的自动装配
  • 配置指向包含要连接的坐标的属性的DataSource
  • @PropertySource的值注入PropertySource的构造函数:

    BFPP