diff --git a/druid-spring-boot-actuator-autoconfigure/pom.xml b/druid-spring-boot-actuator-autoconfigure/pom.xml
index a983759..a3cb3df 100644
--- a/druid-spring-boot-actuator-autoconfigure/pom.xml
+++ b/druid-spring-boot-actuator-autoconfigure/pom.xml
@@ -7,7 +7,7 @@
com.github.drtrang
druid-spring-boot
- 1.1.1
+ 1.1.2-SNAPSHOT
druid-spring-boot-actuator-autoconfigure
diff --git a/druid-spring-boot-actuator/src/main/java/com/github/trang/druid/actuate/DruidDataSourceEndpoint.java b/druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/DruidDataSourceEndpoint.java
similarity index 100%
rename from druid-spring-boot-actuator/src/main/java/com/github/trang/druid/actuate/DruidDataSourceEndpoint.java
rename to druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/DruidDataSourceEndpoint.java
diff --git a/druid-spring-boot-actuator/src/main/java/com/github/trang/druid/actuate/DruidDataSourceMvcEndpoint.java b/druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/DruidDataSourceMvcEndpoint.java
similarity index 100%
rename from druid-spring-boot-actuator/src/main/java/com/github/trang/druid/actuate/DruidDataSourceMvcEndpoint.java
rename to druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/DruidDataSourceMvcEndpoint.java
diff --git a/druid-spring-boot-actuator/src/main/java/com/github/trang/druid/actuate/DruidDataSourcePoolMetadata.java b/druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/DruidDataSourcePoolMetadata.java
similarity index 100%
rename from druid-spring-boot-actuator/src/main/java/com/github/trang/druid/actuate/DruidDataSourcePoolMetadata.java
rename to druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/DruidDataSourcePoolMetadata.java
diff --git a/druid-spring-boot-actuator-starter/pom.xml b/druid-spring-boot-actuator-starter/pom.xml
index a0df15a..e9131d2 100644
--- a/druid-spring-boot-actuator-starter/pom.xml
+++ b/druid-spring-boot-actuator-starter/pom.xml
@@ -7,7 +7,7 @@
com.github.drtrang
druid-spring-boot
- 1.1.1
+ 1.1.2-SNAPSHOT
druid-spring-boot-actuator-starter
diff --git a/druid-spring-boot-actuator/pom.xml b/druid-spring-boot-actuator/pom.xml
index 9df3e6d..0228aa4 100644
--- a/druid-spring-boot-actuator/pom.xml
+++ b/druid-spring-boot-actuator/pom.xml
@@ -7,7 +7,7 @@
com.github.drtrang
druid-spring-boot
- 1.1.1
+ 1.1.2-SNAPSHOT
druid-spring-boot-actuator
diff --git a/druid-spring-boot-autoconfigure/pom.xml b/druid-spring-boot-autoconfigure/pom.xml
index 1e01dfc..10736f2 100644
--- a/druid-spring-boot-autoconfigure/pom.xml
+++ b/druid-spring-boot-autoconfigure/pom.xml
@@ -7,7 +7,7 @@
com.github.drtrang
druid-spring-boot
- 1.1.1
+ 1.1.2-SNAPSHOT
druid-spring-boot-autoconfigure
diff --git a/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java b/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java
index e6a7df6..fb77006 100644
--- a/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java
+++ b/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java
@@ -9,12 +9,13 @@ import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
-import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2;
import com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
@@ -23,8 +24,7 @@ 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 javax.sql.DataSource;
+import org.springframework.core.env.ConfigurableEnvironment;
import static com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties.*;
@@ -39,7 +39,7 @@ import static com.github.trang.druid.autoconfigure.properties.DruidDataSourcePro
@EnableConfigurationProperties({DataSourceProperties.class, DruidDataSourceProperties.class})
@Import({DruidServletConfiguration.class, DruidStatConfiguration.class})
@Slf4j
-public class DruidAutoConfiguration {
+public class DruidAutoConfiguration implements InitializingBean {
@Bean
@ConditionalOnProperty(prefix = DRUID_STAT_FILTER_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
@@ -105,11 +105,39 @@ public class DruidAutoConfiguration {
return new CommonsLogFilter();
}
- @Bean(initMethod = "init", destroyMethod = "close")
- @ConditionalOnMissingBean(DataSource.class)
- public DruidDataSource dataSource() {
- log.debug("druid data-source init...");
- return new DruidDataSource2();
+ @Autowired
+ private DefaultListableBeanFactory beanFactory;
+ @Autowired
+ private ConfigurableEnvironment environment;
+ @Autowired
+ private DruidDataSourceProperties druidDataSourceProperties;
+
+ private static final String PRIMARY_DATA_SOURCE_NAME = "dataSource";
+ private static final String DATA_SOURCE_NAME_SUFFIX = "DataSource";
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+// if (druidDataSourceProperties.getDataSources().isEmpty() && !beanFactory.containsBean(PRIMARY_DATA_SOURCE_NAME)) {
+// BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class)
+// .setInitMethodName("init")
+// .setDestroyMethodName("close")
+// .getBeanDefinition();
+// beanFactory.registerBeanDefinition(PRIMARY_DATA_SOURCE_NAME, beanDefinition);
+// log.debug("druid data-source init...");
+// } else {
+// druidDataSourceProperties.getDataSources().forEach((dataSourceName, dataSourceConfig) -> {
+// BeanDefinition eachBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class)
+// .setInitMethodName("init")
+// .setDestroyMethodName("close")
+// .getBeanDefinition();
+// String beanName = dataSourceName + DATA_SOURCE_NAME_SUFFIX;
+// beanFactory.registerBeanDefinition(beanName, eachBeanDefinition);
+// DruidDataSource2 eachDataSource = beanFactory.getBean(beanName, DruidDataSource2.class);
+// PropertySourcesBinder propertySourcesBinder = new PropertySourcesBinder(environment);
+// propertySourcesBinder.bindTo("spring.datasource.druid.data-sources." + dataSourceName, eachDataSource);
+// log.debug("druid {}-data-source init...", dataSourceName);
+// });
+// }
}
}
\ No newline at end of file
diff --git a/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/DruidDataSource2Support.java b/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/DruidDataSource2Support.java
index e9e15b9..4f41d5e 100644
--- a/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/DruidDataSource2Support.java
+++ b/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/datasource/DruidDataSource2Support.java
@@ -75,7 +75,7 @@ public abstract class DruidDataSource2Support extends DruidDataSource {
List proxyFilters = super.getProxyFilters();
Optional.ofNullable(druidFilters)
.filter(filters -> !filters.isEmpty())
- .ifPresent(dfs -> dfs.stream()
+ .ifPresent(filters -> filters.stream()
.filter(Objects::nonNull)
.filter(filter -> !proxyFilters.contains(filter))
.forEach(proxyFilters::add)
diff --git a/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java b/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java
index 46019cb..5fb224a 100644
--- a/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java
+++ b/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java
@@ -1,10 +1,14 @@
package com.github.trang.druid.autoconfigure.properties;
+import com.alibaba.druid.pool.DruidDataSource;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
+import java.util.HashMap;
+import java.util.Map;
+
import static com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties.DRUID_DATA_SOURCE_PREFIX;
/**
@@ -40,6 +44,8 @@ public class DruidDataSourceProperties {
DruidWebStatProperties webStat = new DruidWebStatProperties();
@NestedConfigurationProperty
DruidAopStatProperties aopStat = new DruidAopStatProperties();
+ @NestedConfigurationProperty
+ Map dataSources = new HashMap<>(16);
@Getter@Setter
public static class DruidConfigFilterProperties {
diff --git a/druid-spring-boot-samples/pom.xml b/druid-spring-boot-samples/pom.xml
index 94d1770..df6ea4f 100644
--- a/druid-spring-boot-samples/pom.xml
+++ b/druid-spring-boot-samples/pom.xml
@@ -7,7 +7,7 @@
com.github.drtrang
druid-spring-boot
- 1.1.1
+ 1.1.2-SNAPSHOT
druid-spring-boot-samples
@@ -35,10 +35,10 @@
com.github.drtrang
druid-spring-boot-starter
-
+
com.h2database
h2
diff --git a/druid-spring-boot-samples/src/main/java/com/github/trang/druid/config/SpringDataSourceConfig.java b/druid-spring-boot-samples/src/main/java/com/github/trang/druid/config/SpringDataSourceConfig.java
index 89cc094..afcb797 100644
--- a/druid-spring-boot-samples/src/main/java/com/github/trang/druid/config/SpringDataSourceConfig.java
+++ b/druid-spring-boot-samples/src/main/java/com/github/trang/druid/config/SpringDataSourceConfig.java
@@ -30,8 +30,8 @@ public class SpringDataSourceConfig {
* 前缀的配置,若名称相同则会被 `spring.datasource.druid.one` 覆盖
*/
@Bean(initMethod = "init", destroyMethod = "close")
- @ConfigurationProperties("spring.datasource.druid.one")
- public DruidDataSource firstDataSource() {
+ @ConfigurationProperties("spring.datasource.druid.data-sources.one")
+ public DruidDataSource oneDataSource() {
log.debug("druid first-data-source init...");
return new DruidDataSource2();
}
@@ -40,19 +40,19 @@ public class SpringDataSourceConfig {
* 第二个数据源,若还有其它数据源可以继续增加
*/
@Bean(initMethod = "init", destroyMethod = "close")
- @ConfigurationProperties("spring.datasource.druid.two")
- public DruidDataSource secondDataSource() {
+ @ConfigurationProperties("spring.datasource.druid.data-sources.two")
+ public DruidDataSource twoDataSource() {
log.debug("druid second-data-source init...");
return new DruidDataSource2();
}
@Bean
@Primary
- public DynamicDataSource dataSource(DruidDataSource firstDataSource, DruidDataSource secondDataSource) {
+ public DynamicDataSource dataSource(DruidDataSource oneDataSource, DruidDataSource twoDataSource) {
Map targetDataSources = new HashMap<>(8);
- targetDataSources.put(firstDataSource.getName(), firstDataSource);
- targetDataSources.put(secondDataSource.getName(), secondDataSource);
- return new DynamicDataSource(firstDataSource, targetDataSources);
+ targetDataSources.put(oneDataSource.getName(), oneDataSource);
+ targetDataSources.put(twoDataSource.getName(), twoDataSource);
+ return new DynamicDataSource(oneDataSource, targetDataSources);
}
}
\ No newline at end of file
diff --git a/druid-spring-boot-samples/src/main/resources/application-dynamic.yml b/druid-spring-boot-samples/src/main/resources/application-dynamic.yml
new file mode 100644
index 0000000..af25743
--- /dev/null
+++ b/druid-spring-boot-samples/src/main/resources/application-dynamic.yml
@@ -0,0 +1,18 @@
+debug: false
+
+spring:
+ autoconfigure:
+ exclude:
+ # 多数据源场景会导致 `javax.sql.DataSource` 和 `org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer`
+ # 循环依赖,所以需要手动排除 `org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration`
+ - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
+ datasource:
+ druid:
+ # 继承 spring.datasource.druid 前缀的配置,同时可以自定义配置,若名称相同则覆盖父配置
+ data-sources:
+ one:
+ max-active: 50
+ max-open-prepared-statements: 50
+ two:
+ max-active: 25
+ max-open-prepared-statements: 25
\ No newline at end of file
diff --git a/druid-spring-boot-samples/src/main/resources/application.yml b/druid-spring-boot-samples/src/main/resources/application.yml
index 0c2de16..9e0befe 100644
--- a/druid-spring-boot-samples/src/main/resources/application.yml
+++ b/druid-spring-boot-samples/src/main/resources/application.yml
@@ -11,7 +11,7 @@ logging:
spring:
profiles:
# 默认环境为 default,多数据源演示请改为 dynamic
- active: default
+ active: dynamic
output:
ansi:
enabled: detect
@@ -113,14 +113,13 @@ spring:
datasource:
druid:
# 继承 spring.datasource.druid 前缀的配置,同时可以自定义配置,若名称相同则覆盖父配置
- one:
- name: one
- max-active: 50
- max-open-prepared-statements: 50
- two:
- name: two
- max-active: 25
- max-open-prepared-statements: 25
+ data-sources:
+ one:
+ max-active: 50
+ max-open-prepared-statements: 50
+ two:
+ max-active: 25
+ max-open-prepared-statements: 25
---
diff --git a/druid-spring-boot-starter/pom.xml b/druid-spring-boot-starter/pom.xml
index 5224d33..0b98445 100644
--- a/druid-spring-boot-starter/pom.xml
+++ b/druid-spring-boot-starter/pom.xml
@@ -7,7 +7,7 @@
com.github.drtrang
druid-spring-boot
- 1.1.1
+ 1.1.2-SNAPSHOT
druid-spring-boot-starter
diff --git a/pom.xml b/pom.xml
index 32bc5d3..b98b134 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.github.drtrang
druid-spring-boot
- 1.1.1
+ 1.1.2-SNAPSHOT
pom
Druid Spring Boot Starter