From 22ee85dc697f35a895bc94415904b9251678525f Mon Sep 17 00:00:00 2001 From: trang Date: Thu, 16 Nov 2017 17:15:47 +0800 Subject: [PATCH] 1.1.2 --- .../pom.xml | 2 +- .../actuate/DruidDataSourceEndpoint.java | 0 .../actuate/DruidDataSourceMvcEndpoint.java | 0 .../actuate/DruidDataSourcePoolMetadata.java | 0 druid-spring-boot-actuator-starter/pom.xml | 2 +- druid-spring-boot-actuator/pom.xml | 2 +- druid-spring-boot-autoconfigure/pom.xml | 2 +- .../autoconfigure/DruidAutoConfiguration.java | 48 +++++++++++++++---- .../datasource/DruidDataSource2Support.java | 2 +- .../properties/DruidDataSourceProperties.java | 6 +++ druid-spring-boot-samples/pom.xml | 6 +-- .../druid/config/SpringDataSourceConfig.java | 16 +++---- .../main/resources/application-dynamic.yml | 18 +++++++ .../src/main/resources/application.yml | 17 ++++--- druid-spring-boot-starter/pom.xml | 2 +- pom.xml | 2 +- 16 files changed, 88 insertions(+), 37 deletions(-) rename {druid-spring-boot-actuator => druid-spring-boot-actuator-autoconfigure}/src/main/java/com/github/trang/druid/actuate/DruidDataSourceEndpoint.java (100%) rename {druid-spring-boot-actuator => druid-spring-boot-actuator-autoconfigure}/src/main/java/com/github/trang/druid/actuate/DruidDataSourceMvcEndpoint.java (100%) rename {druid-spring-boot-actuator => druid-spring-boot-actuator-autoconfigure}/src/main/java/com/github/trang/druid/actuate/DruidDataSourcePoolMetadata.java (100%) create mode 100644 druid-spring-boot-samples/src/main/resources/application-dynamic.yml 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