feat: providers all need defaultcreator

This commit is contained in:
TaoYu 2023-05-30 10:17:18 +08:00
parent c83de09ec1
commit 145bd7cede
5 changed files with 61 additions and 38 deletions

View File

@ -16,6 +16,8 @@
package com.baomidou.dynamic.datasource.spring.boot.autoconfigure;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.event.DataSourceInitEvent;
import com.baomidou.dynamic.datasource.event.EncDataSourceInitEvent;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
@ -28,6 +30,8 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import java.util.List;
/**
* 动态数据源核心自动配置类
*
@ -46,8 +50,8 @@ public class DynamicDataSourceAssistConfiguration {
@Bean
@Order(0)
public DynamicDataSourceProvider ymlDynamicDataSourceProvider() {
return new YmlDynamicDataSourceProvider(properties.getDatasource());
public DynamicDataSourceProvider ymlDynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator) {
return new YmlDynamicDataSourceProvider(defaultDataSourceCreator, properties.getDatasource());
}
@Bean
@ -55,4 +59,17 @@ public class DynamicDataSourceAssistConfiguration {
public DataSourceInitEvent dataSourceInitEvent() {
return new EncDataSourceInitEvent();
}
@Bean
@ConditionalOnMissingBean
public DefaultDataSourceCreator dataSourceCreator(List<DataSourceCreator> dataSourceCreators) {
DefaultDataSourceCreator creator = new DefaultDataSourceCreator();
creator.setCreators(dataSourceCreators);
creator.setPublicKey(properties.getPublicKey());
creator.setLazy(properties.getLazy());
creator.setP6spy(properties.getP6spy());
creator.setSeata(properties.getSeata());
creator.setSeataMode(properties.getSeataMode());
return creator;
}
}

View File

@ -18,8 +18,6 @@ package com.baomidou.dynamic.datasource.spring.boot.autoconfigure;
import cn.beecp.BeeDataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.atomikos.AtomikosDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.basic.BasicDataSourceCreator;
import com.baomidou.dynamic.datasource.creator.beecp.BeeCpDataSourceCreator;
@ -33,14 +31,11 @@ import lombok.RequiredArgsConstructor;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.transaction.TransactionFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import java.util.List;
/**
* @author TaoYu
*/
@ -58,14 +53,6 @@ public class DynamicDataSourceCreatorAutoConfiguration {
public static final int DEFAULT_ORDER = 7000;
private final DynamicDataSourceProperties properties;
@Bean
@ConditionalOnMissingBean
public DefaultDataSourceCreator dataSourceCreator(List<DataSourceCreator> dataSourceCreators) {
DefaultDataSourceCreator creator = new DefaultDataSourceCreator();
creator.setCreators(dataSourceCreators);
return creator;
}
@Bean
@Order(DEFAULT_ORDER)
public BasicDataSourceCreator basicDataSourceCreator() {

View File

@ -19,6 +19,7 @@ import com.baomidou.dynamic.datasource.ds.ItemDataSource;
import com.baomidou.dynamic.datasource.enums.SeataMode;
import com.baomidou.dynamic.datasource.event.DataSourceInitEvent;
import com.baomidou.dynamic.datasource.support.ScriptRunner;
import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
import com.p6spy.engine.spy.P6DataSource;
import io.seata.rm.datasource.DataSourceProxy;
import io.seata.rm.datasource.xa.DataSourceProxyXA;
@ -41,7 +42,28 @@ public class DefaultDataSourceCreator {
private List<DataSourceCreator> creators;
private DataSourceGlobalConfig config;
/**
* 是否懒加载数据源
*/
private Boolean lazy = false;
/**
* /**
* 是否使用p6spy输出默认不输出
*/
private Boolean p6spy = false;
/**
* 是否使用开启seata默认不开启
*/
private Boolean seata = false;
/**
* seata使用模式默认AT
*/
private SeataMode seataMode = SeataMode.AT;
/**
* 全局默认publicKey
*/
private String publicKey = CryptoUtils.DEFAULT_PUBLIC_KEY_STRING;
private DataSourceInitEvent dataSourceInitEvent;
public DataSource createDataSource(DataSourceProperty dataSourceProperty) {
@ -55,19 +77,13 @@ public class DefaultDataSourceCreator {
if (dataSourceCreator == null) {
throw new IllegalStateException("creator must not be null,please check the DataSourceCreator");
}
String publicKey = dataSourceProperty.getPublicKey();
if (StringUtils.isEmpty(publicKey)) {
if (config != null) {
publicKey = config.getPublicKey();
dataSourceProperty.setPublicKey(publicKey);
}
String propertyPublicKey = dataSourceProperty.getPublicKey();
if (StringUtils.isEmpty(propertyPublicKey)) {
dataSourceProperty.setPublicKey(publicKey);
}
Boolean lazy = dataSourceProperty.getLazy();
if (lazy == null) {
if (config != null) {
lazy = config.getLazy();
dataSourceProperty.setLazy(lazy);
}
Boolean propertyLazy = dataSourceProperty.getLazy();
if (propertyLazy == null) {
dataSourceProperty.setLazy(lazy);
}
if (dataSourceInitEvent != null) {
dataSourceInitEvent.beforeCreate(dataSourceProperty);
@ -77,8 +93,7 @@ public class DefaultDataSourceCreator {
dataSourceInitEvent.afterCreate(dataSource);
}
this.runScrip(dataSource, dataSourceProperty);
return dataSource;
// return wrapDataSource(dataSource, dataSourceProperty);
return wrapDataSource(dataSource, dataSourceProperty);
}
private void runScrip(DataSource dataSource, DataSourceProperty dataSourceProperty) {
@ -100,14 +115,13 @@ public class DefaultDataSourceCreator {
String name = dataSourceProperty.getPoolName();
DataSource targetDataSource = dataSource;
Boolean enabledP6spy = config.getP6spy() && dataSourceProperty.getP6spy();
Boolean enabledP6spy = p6spy && dataSourceProperty.getP6spy();
if (enabledP6spy) {
targetDataSource = new P6DataSource(dataSource);
log.debug("dynamic-datasource [{}] wrap p6spy plugin", name);
}
Boolean enabledSeata = config.getSeata() && dataSourceProperty.getSeata();
SeataMode seataMode = config.getSeataMode();
Boolean enabledSeata = seata && dataSourceProperty.getSeata();
if (enabledSeata) {
if (SeataMode.XA == seataMode) {
targetDataSource = new DataSourceProxyXA(targetDataSource);

View File

@ -17,8 +17,8 @@ package com.baomidou.dynamic.datasource.provider;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import javax.sql.DataSource;
import java.util.HashMap;
@ -28,10 +28,10 @@ import java.util.Map;
* @author TaoYu
*/
@Slf4j
@AllArgsConstructor
public abstract class AbstractDataSourceProvider implements DynamicDataSourceProvider {
@Autowired
private DefaultDataSourceCreator defaultDataSourceCreator;
private final DefaultDataSourceCreator defaultDataSourceCreator;
protected Map<String, DataSource> createDataSourceMap(
Map<String, DataSourceProperty> dataSourcePropertiesMap) {

View File

@ -16,7 +16,7 @@
package com.baomidou.dynamic.datasource.provider;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import lombok.AllArgsConstructor;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import lombok.extern.slf4j.Slf4j;
import javax.sql.DataSource;
@ -29,7 +29,6 @@ import java.util.Map;
* @since 1.0.0
*/
@Slf4j
@AllArgsConstructor
public class YmlDynamicDataSourceProvider extends AbstractDataSourceProvider {
/**
@ -37,6 +36,12 @@ public class YmlDynamicDataSourceProvider extends AbstractDataSourceProvider {
*/
private final Map<String, DataSourceProperty> dataSourcePropertiesMap;
public YmlDynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, Map<String, DataSourceProperty> dataSourcePropertiesMap) {
super(defaultDataSourceCreator);
this.dataSourcePropertiesMap = dataSourcePropertiesMap;
}
@Override
public Map<String, DataSource> loadDataSources() {
return createDataSourceMap(dataSourcePropertiesMap);