我正在使用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
类中获取该列表?任何其他解决方法都将受到欢迎。 :)
答案 0 :(得分:0)
BeanFactoryPostProcessor
是Spring中一种非常特殊的概念。它们是在BeanDefinition
个实例上运行的组件,它们是要创建的bean实例的元模型。
这意味着,在调用BFPP
的时间点,由于元模型即将进行后处理(顾名思义),因此尚未创建任何bean实例。因此,BFPP
所依赖的bean将在容器的生命周期的早期初始化极。因此,强烈建议不要依赖于来自BFPP
的应用程序组件,或者 - 如果确实需要 - 仅依赖于不一定会触发创建大量下游组件的bean。
也就是说,您不应该依赖BFPP
的特别存储库,因为它们通常需要创建大量基础架构组件。我建议获取连接到配置数据库所需的配置属性(JDBC URL,用户名,密码等),然后创建一个仅用于创建新{{1}的丢弃DataSource
对于最终将由应用程序使用的新BeanDefinition
。
所以这里是建议的步骤(从我的头脑 - 可能需要一些调整):
DataSource
DataSource
将@PropertySource
的值注入PropertySource
的构造函数:
BFPP