有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    BeanFactoryPostProcessor在春天是一种非常特殊的概念。它们是在BeanDefinition实例上操作的组件,这些实例是要创建的bean实例的元模型

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

    也就是说,您不应该特别依赖于来自BFPP的存储库,因为它们通常需要创建许多基础结构组件。我建议获取连接到配置数据库所需的配置属性(JDBCURL、用户名、密码等),然后创建一个一次性的DataSource,它只用于为应用程序最终将要使用的新DataSource创建一个新的BeanDefinition

    下面是建议的步骤(从我的头顶开始-可能需要一些调整):

    • 删除DataSource的自动连线
    • 配置一个指向包含要连接的坐标的属性的@PropertySource
    • 将该PropertySource的值注入BFPP的构造函数中:

      class YourBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
      
        public YourBeanFactoryPostProcessor(@Value("#{properties.url}) String url, …) {
          // assign to fields
        }
      
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
      
          // 1. Create throw-away DataSource
          // 2. Create JdbcTemplate
          // 3. Use template to lookup configuration properties
          // 4. Create BeanDefinition for DataSource using properties just read
          // 5. Register BeanDefinition with the BeanFactory
        }
      }