package com.qianwen.smartman.modules.visual.dynamic;
|
|
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
|
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
|
import com.baomidou.dynamic.datasource.creator.DruidDataSourceCreator;
|
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
|
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
|
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
|
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceCreatorAutoConfiguration;
|
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
|
import java.util.List;
|
import javax.sql.DataSource;
|
import com.qianwen.core.tenant.config.TenantDataSourceConfiguration;
|
import com.qianwen.smartman.modules.visual.dynamic.provider.CheckSqlProvider;
|
import org.springframework.beans.factory.SmartInitializingSingleton;
|
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Import;
|
import org.springframework.core.annotation.Order;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
@AutoConfigureBefore({TenantDataSourceConfiguration.class, DruidDataSourceAutoConfigure.class, DynamicDataSourceAutoConfiguration.class})
|
@EnableConfigurationProperties({DataSourceProperties.class, DynamicDataSourceProperties.class})
|
@Configuration(proxyBeanMethods = false)
|
@Import({DynamicDataSourceCreatorAutoConfiguration.class})
|
|
public class DynamicDataSourceConfiguration {
|
private List<CheckSqlProvider> sqlProviders;
|
|
@Bean
|
public DynamicDataSourceProvider dynamicDataSourceProvider(DataSourceProperties dataSourceProperties, DynamicDataSourceProperties dynamicDataSourceProperties, List<CheckSqlProvider> sqlProviders) {
|
String driverClassName = dataSourceProperties.getDriverClassName();
|
String url = dataSourceProperties.getUrl();
|
String username = dataSourceProperties.getUsername();
|
String password = dataSourceProperties.getPassword();
|
DataSourceProperty master = (DataSourceProperty) dynamicDataSourceProperties.getDatasource().get(dynamicDataSourceProperties.getPrimary());
|
if (master != null) {
|
driverClassName = master.getDriverClassName();
|
url = master.getUrl();
|
username = master.getUsername();
|
password = master.getPassword();
|
}
|
return new DynamicDataSourceJdbcProvider(dynamicDataSourceProperties, driverClassName, url, username, password, sqlProviders);
|
}
|
|
@Bean
|
public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider, DynamicDataSourceProperties dynamicDataSourceProperties) {
|
DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
|
dataSource.setPrimary(dynamicDataSourceProperties.getPrimary());
|
dataSource.setStrict(dynamicDataSourceProperties.getStrict());
|
dataSource.setStrategy(dynamicDataSourceProperties.getStrategy());
|
dataSource.setProvider(dynamicDataSourceProvider);
|
dataSource.setP6spy(dynamicDataSourceProperties.getP6spy());
|
dataSource.setSeata(dynamicDataSourceProperties.getSeata());
|
return dataSource;
|
}
|
|
@Bean
|
public DynamicDataSourceHolder dataSourceHolder() {
|
return new DynamicDataSourceHolder();
|
}
|
|
@Configuration(proxyBeanMethods = false)
|
@Order
|
|
public static class DataSourceHolderConfiguration implements SmartInitializingSingleton {
|
private final DataSource dataSource;
|
private final DruidDataSourceCreator dataSourceCreator;
|
private final JdbcTemplate jdbcTemplate;
|
private final DynamicDataSourceHolder dynamicDataSourceHolder;
|
|
public DataSourceHolderConfiguration(final DataSource dataSource, final DruidDataSourceCreator dataSourceCreator, final JdbcTemplate jdbcTemplate, final DynamicDataSourceHolder dynamicDataSourceHolder) {
|
this.dataSource = dataSource;
|
this.dataSourceCreator = dataSourceCreator;
|
this.jdbcTemplate = jdbcTemplate;
|
this.dynamicDataSourceHolder = dynamicDataSourceHolder;
|
}
|
|
public void afterSingletonsInstantiated() {
|
this.dynamicDataSourceHolder.setDataSource(this.dataSource);
|
this.dynamicDataSourceHolder.setDataSourceCreator(this.dataSourceCreator);
|
this.dynamicDataSourceHolder.setJdbcTemplate(this.jdbcTemplate);
|
}
|
}
|
}
|