java—如何在spring boot应用程序中动态注入和使用多个数据源?

xbp102n0  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(256)

我有这些档案,uat纽约,uat ldn。uat-nyc数据源是oracle,uat-ldn是mysql服务器。此配置在application-uat-nyc.yml和application-uat-ldn.yml中设置
我有以下配置类

@Profile({"uat-nyc", "uat-ldn"})
    @Configuration
    @EnableConfigurationPropeties(DatSourceProperties.class)
    public class DataSourceConfig{

    private DataSourceProperties properties; // server, username, password are set here

    DataSource getDataSource(){// gets datasource based on profiles}

    }

如果我的应用程序使用spring.profiles.active:uat-nyc、uat-ldn运行,它会创建两个数据源吗?
一个配置来自uat nyc,另一个配置来自uat ldn
我在下面有一个函数,在这个函数中,我从第三方服务获取数据,根据ldn或nyc的不同,我需要持久保存到ldn或nyc数据库中。如何使下面的if-else部分动态?我如何在下面的getproducts方法的if-else部分中获得各自的数据源,即ldn和nyc?

class Product{
       String name;
       int price;
       int region;
    }

     @Component
     Class ProductLoader{

        JdbcTemplate jdbcTemplate;

         public ProductLoader(DataSource ds){

                 jdbcTemplate = new JdbcTemplate(ds);
         }

        public void getProducts(){
             List<Product> products = // rest service to get products
             if(Product product : product){
                          if(product.getRegion().equals("LONDON"){
                            //write to LONDON datbase
                           // How can I get ldn datasource here?
                          }
                          if else(product.getRegion().equals("NewYork"){
                               //write to NewYork datbase
                               How can I get NewYork datasource here? 
                          }
                          else{
                               // Unknown location
                          }
             }

    }
}

问题:-
如果我的应用程序使用spring.profiles.active:uat-nyc、uat-ldn运行,它会创建两个数据源吗?
如何将数据源动态注入productloader,并为ldn和nyc使用特定的数据源

ctehm74n

ctehm74n1#

第一次您需要告诉spring您将使用两个数据源,它们将由context spring管理。在@configuration类上使用@bean,然后使用@autowired来声明spring管理的变量。
您可以使用@qualifier来选择和限定您的bean

@Configuration
public class ConfigDataSource {

    // example for dataSource

    @Bean("dataSourceWithPropOnCode") // this name will qualify on @autowired
    public DataSource dataSourceWithPropOnCode() {
        return DataSourceBuilder.create().url("").password("").username("").driverClassName("").build();
    }

    @Bean("dataSourceWithPropFromProperties")  // this name will qualify on @autowired
    @ConfigurationProperties(prefix="spring.datasource.yourname-datasource") // this is the name for the prefix for datasource on .properties settings
    public DataSource dataSourcePostgres() {
        return DataSourceBuilder.create().build();
    }

    // example for jdbctemplate

    @Bean("jdbcTemaplateWithPropFromProperties")  // this name will qualify on @autowired
    public JdbcTemplate jdbcTemplatePostgres(@Qualifier("dataSourceWithPropFromProperties") DataSource dataSource) {
     return new JdbcTemplate(dataSource);
    }

    @Bean("jdbcTemaplateWithPropOnCode")  // this name will qualify on @autowired
    public JdbcTemplate jdbcTemplatePostgres(@Qualifier("dataSourceWithPropOnCode") DataSource dataSource) {
     return new JdbcTemplate(dataSource);
    }

}

属性设置

spring.datasource.yourname-datasource.url=...
spring.datasource.yourname-datasource.jdbcUrl=${spring.datasource.yourname-datasource}
spring.datasource.yourname-datasource.username=user
spring.datasource.yourname-datasource.password=pass
spring.datasource.yourname-datasource.driver-class-name=your.driver

在服务上使用

@Qualifier("jdbcTemaplateWithPropFromProperties")
    @Autowired
    private JdbcTemplate jdbcTemplate1;

    @Qualifier("jdbcTemaplateWithPropOnCode")
    @Autowired
    private JdbcTemplate jdbcTemplate2;

    @Qualifier("dataSourceWithPropOnCode")
    @Autowired
    private DataSource dataSource1;

    private DataSource dataSource2;

    public someContructorIfYouPrefer(@Qualifier("dataSourceWithPropFromProperties") @Autowired private DataSource dataSource2){
        this.dataSource2 = dataSource2;
    }

相关问题