This commit is contained in:
trang
2017-07-21 21:32:09 +08:00
parent 603c4bad49
commit 8d4d7360dd
10 changed files with 145 additions and 51 deletions
+9 -2
View File
@@ -1,4 +1,11 @@
# TODO
1. 新增 `ConfigFilter` 的配置,替换默认的 ConnectProperties 方式
2. 新增 `@EnableDynamicDruidDataSource`,自动配置动态数据源
## Add
* ~~新增 ConfigFilter 配置,替换默认的 `connectProperties` 方式~~
* 新增 `@EnableDynamicDruidDataSource`,自动配置动态数据源
## Bug
* ~~`spring.datasource.schema` 会执行两次~~
## Optimize:
* `DataSourceCustomizer` 方式自定义数据源
@@ -1,30 +0,0 @@
package com.github.trang.druid;
import com.github.trang.druid.datasource.init.DataSourceInitializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
/**
* 支持数据源初始化时执行 SQL
*
* 照搬自 #{@link org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer}
*
* 在多数据源场景下,#{@link DataSourceAutoConfiguration} 会报 #{@code DataSource} 和
* #{@code DataSourceInitializer} 的循环依赖,目前的解决办法是排除 #{@link DataSourceAutoConfiguration},
* 但是这样一来,Spring Boot 在数据源初始化时执行 SQL 的特性会被移除,此类是为了保留该特性
*
* @author trang
*/
public class DataSourceInitializerConfiguration {
@Bean
@ConditionalOnMissingBean(DataSourceInitializer.class)
public com.github.trang.druid.datasource.init.DataSourceInitializer customDataSourceInitializer
(DataSourceProperties properties, ApplicationContext applicationContext) {
return new DataSourceInitializer(properties, applicationContext);
}
}
@@ -10,6 +10,7 @@ import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import com.github.trang.druid.datasource.DruidParentDataSource;
import com.github.trang.druid.properties.DruidFilterProperties.DruidConfigFilterProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
@@ -26,6 +27,7 @@ import org.springframework.context.annotation.Import;
import javax.sql.DataSource;
import static com.github.trang.druid.properties.DruidFilterProperties.DruidConfigFilterProperties.*;
import static com.github.trang.druid.properties.DruidProperties.*;
/**
@@ -36,8 +38,8 @@ import static com.github.trang.druid.properties.DruidProperties.*;
@Configuration
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({DruidStatConfiguration.class, DruidServletConfiguration.class, DataSourceInitializerConfiguration.class})
@EnableConfigurationProperties({DataSourceProperties.class, DruidConfigFilterProperties.class})
@Import({DruidStatConfiguration.class, DruidServletConfiguration.class})
public class DruidAutoConfiguration {
private static final Logger log = LoggerFactory.getLogger(DruidAutoConfiguration.class);
@@ -70,7 +72,6 @@ public class DruidAutoConfiguration {
@ConditionalOnProperty(prefix = DRUID_CONFIG_FILTER_PREFIX, name = "enabled", havingValue = "true")
@Bean
@ConfigurationProperties(DRUID_CONFIG_FILTER_PREFIX)
public ConfigFilter configFilter() {
log.debug("druid config-filter init...");
return new ConfigFilter();
@@ -0,0 +1,40 @@
package com.github.trang.druid;
import com.github.trang.druid.datasource.init.DruidDataSourceInitializer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* 支持数据源初始化时执行 SQL
*
* 照搬自 #{@link org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer}
*
* 在多数据源场景下,#{@link DataSourceAutoConfiguration} 会报 #{@code DataSource} 和
* #{@code DruidDataSourceInitializer} 的循环依赖,目前的解决办法是排除 #{@link DataSourceAutoConfiguration},
* 但是这样一来,Spring Boot 在数据源初始化时执行 SQL 的特性会被移除,此类是为了保留该特性
*
* @author trang
*/
@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@ConditionalOnBean(DataSource.class)
public class DruidDataSourceInitializerAutoConfiguration {
@Bean
@ConditionalOnMissingBean(
type = "org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer",
value = DruidDataSourceInitializer.class)
public DruidDataSourceInitializer druidDataSourceInitializer(DataSourceProperties properties,
ApplicationContext applicationContext) {
return new DruidDataSourceInitializer(properties, applicationContext);
}
}
@@ -9,6 +9,7 @@ import com.alibaba.druid.filter.logging.Slf4jLogFilter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallFilter;
import com.github.trang.druid.properties.DruidFilterProperties.DruidConfigFilterProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -46,9 +47,40 @@ public abstract class DruidParentDataSource extends DruidDataSource {
// 不使用 @Value 注入,避免因为找不到值抛出 NPE
@Autowired
private DataSourceProperties dataSourceProperties;
@Autowired
private DruidConfigFilterProperties druidConfigFilterProperties;
@PostConstruct
public void initCommonParams() {
public void initDruidParentProperties() {
initDataSourceProperties();
initConfigFilterProperties();
initFilters();
}
private void initFilters() {
List<Filter> filters = super.getProxyFilters();
Stream.of(statFilter, wallFilter, configFilter, slf4jLogFilter, log4jFilter, log4j2Filter, commonsLogFilter)
.filter(Objects::nonNull)
.filter(filter -> !filters.contains(filter))
.forEach(filters::add);
}
private void initConfigFilterProperties() {
if (druidConfigFilterProperties.isEnabled()) {
StringBuilder builder = new StringBuilder();
builder.append(ConfigFilter.CONFIG_DECRYPT).append("=").append("true").append(";");
if (!StringUtils.isEmpty(druidConfigFilterProperties.getKey())) {
builder.append(ConfigFilter.CONFIG_KEY).append("=").append(druidConfigFilterProperties.getKey());
builder.append(";");
}
if (!StringUtils.isEmpty(druidConfigFilterProperties.getFile())) {
builder.append(ConfigFilter.CONFIG_FILE).append("=").append(druidConfigFilterProperties.getFile());
}
super.setConnectionProperties(builder.toString());
}
}
private void initDataSourceProperties() {
if (!StringUtils.isEmpty(dataSourceProperties.getDriverClassName())) {
super.setDriverClassName(dataSourceProperties.getDriverClassName());
}
@@ -61,12 +93,6 @@ public abstract class DruidParentDataSource extends DruidDataSource {
if (!StringUtils.isEmpty(dataSourceProperties.getPassword())) {
super.setPassword(dataSourceProperties.getPassword());
}
List<Filter> filters = super.getProxyFilters();
Stream.of(statFilter, wallFilter, configFilter, slf4jLogFilter, log4jFilter, log4j2Filter,
commonsLogFilter)
.filter(Objects::nonNull)
.filter(filter -> !filters.contains(filter))
.forEach(filters::add);
}
}
@@ -31,11 +31,11 @@ import java.util.List;
* @author Stephane Nicoll
* @author Kazuki Shimizu
* @since 1.1.0
* @see com.github.trang.druid.DataSourceInitializerConfiguration
* @see com.github.trang.druid.DruidDataSourceInitializerAutoConfiguration
*/
public class DataSourceInitializer implements ApplicationListener<DataSourceInitializedEvent> {
public class DruidDataSourceInitializer implements ApplicationListener<DataSourceInitializedEvent> {
private static final Logger logger = LoggerFactory.getLogger(DataSourceInitializer.class);
private static final Logger logger = LoggerFactory.getLogger(DruidDataSourceInitializer.class);
private final DataSourceProperties properties;
@@ -45,8 +45,8 @@ public class DataSourceInitializer implements ApplicationListener<DataSourceInit
private boolean initialized = false;
public DataSourceInitializer(DataSourceProperties properties,
ApplicationContext applicationContext) {
public DruidDataSourceInitializer(DataSourceProperties properties,
ApplicationContext applicationContext) {
this.properties = properties;
this.applicationContext = applicationContext;
}
@@ -0,0 +1,50 @@
package com.github.trang.druid.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import static com.github.trang.druid.properties.DruidFilterProperties.DruidConfigFilterProperties.DRUID_CONFIG_FILTER_PREFIX;
/**
* Dubbo Filter 自定义配置
*
* @author trang
*/
public class DruidFilterProperties {
@ConfigurationProperties(DRUID_CONFIG_FILTER_PREFIX)
public static class DruidConfigFilterProperties {
public static final String DRUID_CONFIG_FILTER_PREFIX = "spring.datasource.druid.config";
private boolean enabled;
private String file;
private String key;
public String getFile() {
return file;
}
public void setFile(String file) {
this.file = file;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
}
@@ -11,7 +11,6 @@ public class DruidProperties {
public static final String DRUID_STAT_FILTER_PREFIX = "spring.datasource.druid.stat";
public static final String DRUID_WALL_FILTER_PREFIX = "spring.datasource.druid.wall";
public static final String DRUID_WALL_CONFIG_PREFIX = "spring.datasource.druid.wall.config";
public static final String DRUID_CONFIG_FILTER_PREFIX = "spring.datasource.druid.config";
public static final String DRUID_SLF4J_FILTER_PREFIX = "spring.datasource.druid.slf4j";
public static final String DRUID_LOG4J_FILTER_PREFIX = "spring.datasource.druid.log4j";
public static final String DRUID_LOG4J2_FILTER_PREFIX = "spring.datasource.druid.log4j2";
@@ -1,2 +1,3 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.github.trang.druid.DruidAutoConfiguration
com.github.trang.druid.DruidAutoConfiguration,\
com.github.trang.druid.DruidDataSourceInitializerAutoConfiguration
@@ -16,7 +16,7 @@ spring:
driver-class-name: org.h2.Driver
url: jdbc:h2:file:./samples
username: root
password: 123456
password: Biyu5YzU+6sxDRbmWEa3B2uUcImzDo0BuXjTlL505+/pTb+/0Oqd3ou1R6J8+9Fy3CYrM18nBDqf6wAaPgUGOg==
schema: classpath:/import.sql
druid:
# spring.datasource.druid 前缀的配置将注入到 DruidParentDataSource,作为公共参数
@@ -57,7 +57,7 @@ spring:
config:
select-all-column-allow: false
config:
enabled: false
enabled: true
aop-stat:
enabled: false
patterns: