Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:如何在运行时管理使用BeanFactoryPostProcessor创建的数据源?_Java_Spring_Postgresql_Spring Data_Spring Data Jpa - Fatal编程技术网

Java Spring:如何在运行时管理使用BeanFactoryPostProcessor创建的数据源?

Java Spring:如何在运行时管理使用BeanFactoryPostProcessor创建的数据源?,java,spring,postgresql,spring-data,spring-data-jpa,Java,Spring,Postgresql,Spring Data,Spring Data Jpa,我正在使用Spring数据JPA开发projet 我已经设法使用BeanFactoryPostProcessor动态创建了数据源,并在使用AbstractRoutingDataSource登录时切换到所需的数据源 现在我想在运行时做的是: 使用获取动态数据源的映射 BeanFactory后处理器 创建一个新的数据源 将最近创建的数据源与其他数据源一起放在地图中 springContext-jpa.xml DatasourceRegisteringBeanFactoryPostProcessor.

我正在使用Spring数据JPA开发projet

我已经设法使用BeanFactoryPostProcessor动态创建了数据源,并在使用AbstractRoutingDataSource登录时切换到所需的数据源

现在我想在运行时做的是:

使用获取动态数据源的映射 BeanFactory后处理器 创建一个新的数据源 将最近创建的数据源与其他数据源一起放在地图中 springContext-jpa.xml

DatasourceRegisteringBeanFactoryPostProcessor.java

问题是BeanFactoryPostProcessor类将ConfigurableListableBeanFactory用作beanFactory

我需要在运行时从另一个类访问同一beanFactory,以便修改我的数据源映射dsCargestWeb->targetDataSources->map


谢谢

我想您可以尝试以下架构:

工厂bean创建数据源的初始映射 AbstractRoutingDataSource实现持有数据源的映射,并最初注入上述工厂bean 这样,如果以后需要添加新的数据源,您可以从AbstractRoutingDataSource实现中获取映射并直接将其添加到映射中,或者在AbstractRoutingDataSource实现中放置一个方法以添加新的数据源

作为上述的一个变体,您可以创建一个类似的AbstractRoutingDataSource实现,以及注入的另一个bean,该bean在其init方法中计算数据源映射并在路由数据源中对其进行排序。

使用RuntimeBeanReference和ManagedSet,您可以将运行时集设置为beanDefine。这是正确的使用方法:

ManagedSet<RuntimeBeanReference> processorSet = new ManagedSet<RuntimeBeanReference>();
    for (String processorBeanName : processorBeanNames) {
        processorSet.add(new RuntimeBeanReference(processorBeanName));
    }
beanDefine.getPropertyValues().addPropertyValue(new PropertyValue(key, value));
@Component 
class DatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {

    // this is my list of Datasources 
    List<Database> dbs = new ArrayList<Database>();

    /*
     * Hidden code, here i get my list of Datasources 
     */

    BeanDefinitionRegistry factory = (BeanDefinitionRegistry) beanFactory;
    BeanDefinitionBuilder datasourceDefinitionBuilder;

    for (Database db : dbs) {
        datasourceDefinitionBuilder = BeanDefinitionBuilder
                .childBeanDefinition("BasicdsCargestWeb") 
                .addPropertyValue("url", db.getUrl()+db.getName()+"?autoReconnect=true");

        factory.registerBeanDefinition("cargestnet"+db.getId()+"ds",
                datasourceDefinitionBuilder.getBeanDefinition());
    }


    // Configure the dataSource bean properties 
    MutablePropertyValues mpv = factory.getBeanDefinition("dsCargestWeb").getPropertyValues();

    // Here you can set the default dataSource 
    mpv.removePropertyValue("defaultTargetDataSource");
    mpv.addPropertyValue("defaultTargetDataSource", 
        new RuntimeBeanReference("cargestnet1ds")); 

    // Set the targetDataSource properties map with the list of connections 
    ManagedMap<String, RuntimeBeanReference> mm = (ManagedMap<String, RuntimeBeanReference>) mpv.getPropertyValue("targetDataSources").getValue();
    System.out.println("list size "+mm.size());

    mm.clear();

    for (Database db : dbs) {
         mm.put(db.getId().toString(), new RuntimeBeanReference("cargestnet"+db.getId()+"ds"));
    }
} 
} 
ManagedSet<RuntimeBeanReference> processorSet = new ManagedSet<RuntimeBeanReference>();
    for (String processorBeanName : processorBeanNames) {
        processorSet.add(new RuntimeBeanReference(processorBeanName));
    }
beanDefine.getPropertyValues().addPropertyValue(new PropertyValue(key, value));