package com.vincent.rsf.server.common.config; import com.vincent.rsf.server.common.datasource.DataSourceNames; import com.vincent.rsf.server.common.datasource.RoutingDataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; /** * 主数据源配置 */ @Configuration public class PrimaryDataSourceConfig { @Bean(name = "primaryDataSourceProperties") @ConfigurationProperties(prefix = "spring.datasource") public DataSourceProperties primaryDataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "primaryDataSource") public DataSource primaryDataSource(@Qualifier("primaryDataSourceProperties") DataSourceProperties properties) { return properties.initializeDataSourceBuilder().build(); } @Bean(name = "dataSource") @Primary public DataSource dataSource( @Qualifier("primaryDataSource") DataSource primaryDataSource, @Qualifier("cusItemSyncDataSource") ObjectProvider cusItemSyncDataSourceProvider) { RoutingDataSource routingDataSource = new RoutingDataSource(); Map map = new HashMap<>(); map.put(DataSourceNames.PRIMARY, primaryDataSource); DataSource cusItemSyncDataSource = cusItemSyncDataSourceProvider.getIfAvailable(); if (cusItemSyncDataSource != null) { map.put(DataSourceNames.CUS_ITEM_SYNC, cusItemSyncDataSource); } routingDataSource.setDefaultTargetDataSource(primaryDataSource); routingDataSource.setTargetDataSources(map); routingDataSource.afterPropertiesSet(); return routingDataSource; } @Bean(name = "jdbcTemplate") @Primary public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } }