mirror of
https://github.com/drtrang/druid-spring-boot.git
synced 2026-10-29 20:43:53 +00:00
1.0.3
This commit is contained in:
@@ -1,4 +1,11 @@
|
||||
# TODO
|
||||
|
||||
1. 新增 `ConfigFilter` 的配置,替换默认的 ConnectProperties 方式
|
||||
2. 新增 `@EnableDynamicDruidDataSource`,自动配置动态数据源
|
||||
## Add
|
||||
* ~~新增 ConfigFilter 配置,替换默认的 `connectProperties` 方式~~
|
||||
* 新增 `@EnableDynamicDruidDataSource`,自动配置动态数据源
|
||||
|
||||
## Bug
|
||||
* ~~`spring.datasource.schema` 会执行两次~~
|
||||
|
||||
## Optimize:
|
||||
* `DataSourceCustomizer` 方式自定义数据源
|
||||
-30
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+4
-3
@@ -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();
|
||||
|
||||
+40
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+33
-7
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+5
-5
@@ -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;
|
||||
}
|
||||
+50
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
-1
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user