java如何连接到BeanFactoryPostProcessor中的数据库?
我正在使用SpringDataJPA(在Tomcat7上)进行一个项目。我正在实现一个BeanFactoryPostProcessor
来动态创建我的DataSource
。但问题是我的DataSource
的信息(名称、url等)存储在数据库本身中
@Component
class DatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
// This doesn't work
@Autowired DatabaseService databaseService;
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// my code here ...
// ...
}
}
如您所见,我试图注入一个服务,它可以从我的数据库中获取所有DataSource
的列表,但它不起作用。是否仍然要连接到数据库并在BeanFactoryPostProcessor
类中获取该列表?欢迎使用任何其他解决方法。:)
# 1 楼答案
BeanFactoryPostProcessor
在春天是一种非常特殊的概念。它们是在BeanDefinition
实例上操作的组件,这些实例是要创建的bean实例的元模型这意味着,在调用
BFPP
时,还没有创建bean实例,因为元模型即将进行后期处理(顾名思义)。因此BFPP
依赖的bean将在容器生命周期的早期被初始化。因此,强烈建议不要依赖于来自BFPP
的应用程序组件,或者——如果确实需要的话——只依赖于不一定会触发大量下游组件创建的bean也就是说,您不应该特别依赖于来自
BFPP
的存储库,因为它们通常需要创建许多基础结构组件。我建议获取连接到配置数据库所需的配置属性(JDBCURL、用户名、密码等),然后创建一个一次性的DataSource
,它只用于为应用程序最终将要使用的新DataSource
创建一个新的BeanDefinition
下面是建议的步骤(从我的头顶开始-可能需要一些调整):
DataSource
的自动连线@PropertySource
将该
PropertySource
的值注入BFPP
的构造函数中: