gpt4 book ai didi

java - 如何连接到 BeanFactoryPostProcessor 中的数据库?

转载 作者:搜寻专家 更新时间:2023-10-30 20:54:59 25 4
gpt4 key购买 nike

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

@Component 
class DatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

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

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

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

最佳答案

BeanFactoryPostProcessor 是 Spring 中一种非常特殊的概念。它们是对 BeanDefinition 实例进行操作的组件,这些实例是要创建 的 bean 实例的元模型。

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

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

所以这里是推荐的步骤(从我的头顶 - 可能需要一些调整):

  • 删除 DataSource 的 Autowiring >
  • 配置一个@PropertySource指向包含要连接的坐标的属性
  • PropertySource 的值注入(inject)到 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
    }
    }

关于java - 如何连接到 BeanFactoryPostProcessor 中的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com