From 7c3210720403b3f27389dbc36e5fda7ed5329684 Mon Sep 17 00:00:00 2001 From: trang Date: Thu, 23 Nov 2017 13:24:29 +0800 Subject: [PATCH 1/2] 1.1.3 --- .../pom.xml | 2 +- .../DruidDataSourceEndpointConfiguration.java | 2 +- .../pom.xml | 2 +- druid-spring-boot-actuator/pom.xml | 2 +- .../druid-spring-boot-mybatis-example/pom.xml | 2 +- .../DruidSpringBootStarterApplication.java | 6 +- .../config/DynamicDataSource.java | 2 +- .../config/SpringDataSourceConfig.java | 2 +- .../controller/CityController.java | 6 +- .../{ => example}/mapper/CityMapper.java | 4 +- .../trang/druid/{ => example}/model/City.java | 2 +- .../src/main/resources/application.yml | 6 +- .../druid/{ => example}/test/BaseTest.java | 4 +- .../test/DynamicDataSourceTests.java | 4 +- .../{ => example}/test/MyBatisTests.java | 4 +- .../trang/druid/example/test/NormalTest.java | 78 ++++++++++ .../test/SingleDataSourceTests.java | 2 +- druid-spring-boot-example/pom.xml | 2 +- .../druid-spring-boot-autoconfigure/pom.xml | 2 +- .../autoconfigure/DruidAutoConfiguration.java | 134 +----------------- .../DruidDataSourceConfiguration.java | 113 +++++++++++++++ .../properties/DruidDataSourceProperties.java | 8 +- .../druid/autoconfigure/util/CharMatcher.java | 133 +++++++++++++++++ .../druid-spring-boot-starter/pom.xml | 2 +- druid-spring-boot/pom.xml | 2 +- pom.xml | 2 +- 26 files changed, 364 insertions(+), 164 deletions(-) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/{ => example}/DruidSpringBootStarterApplication.java (87%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/{ => example}/config/DynamicDataSource.java (96%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/{ => example}/config/SpringDataSourceConfig.java (95%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/{ => example}/controller/CityController.java (71%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/{ => example}/mapper/CityMapper.java (80%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/{ => example}/model/City.java (95%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/{ => example}/test/BaseTest.java (80%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/{ => example}/test/DynamicDataSourceTests.java (98%) rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/{ => example}/test/MyBatisTests.java (83%) create mode 100644 druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java rename druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/{ => example}/test/SingleDataSourceTests.java (96%) create mode 100644 druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java create mode 100644 druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java diff --git a/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/pom.xml b/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/pom.xml index 556efec..a0647a4 100644 --- a/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/pom.xml +++ b/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/pom.xml @@ -7,7 +7,7 @@ com.github.drtrang druid-spring-boot-actuator - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot-actuator-autoconfigure diff --git a/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/autoconfigure/DruidDataSourceEndpointConfiguration.java b/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/autoconfigure/DruidDataSourceEndpointConfiguration.java index c453575..b232097 100644 --- a/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/autoconfigure/DruidDataSourceEndpointConfiguration.java +++ b/druid-spring-boot-actuator/druid-spring-boot-actuator-autoconfigure/src/main/java/com/github/trang/druid/actuate/autoconfigure/DruidDataSourceEndpointConfiguration.java @@ -1,7 +1,7 @@ package com.github.trang.druid.actuate.autoconfigure; -import com.github.trang.druid.actuate.DruidDataSourceEndpoint; import com.github.trang.druid.actuate.DruidDataSourceMvcEndpoint; +import com.github.trang.druid.actuate.DruidDataSourceEndpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; diff --git a/druid-spring-boot-actuator/druid-spring-boot-actuator-starter/pom.xml b/druid-spring-boot-actuator/druid-spring-boot-actuator-starter/pom.xml index 0c9da63..0f434de 100644 --- a/druid-spring-boot-actuator/druid-spring-boot-actuator-starter/pom.xml +++ b/druid-spring-boot-actuator/druid-spring-boot-actuator-starter/pom.xml @@ -7,7 +7,7 @@ com.github.drtrang druid-spring-boot-actuator - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot-actuator-starter diff --git a/druid-spring-boot-actuator/pom.xml b/druid-spring-boot-actuator/pom.xml index c7b7ebe..cd2c5c6 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-parent - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot-actuator diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/pom.xml b/druid-spring-boot-example/druid-spring-boot-mybatis-example/pom.xml index 3dd44c9..6cf923a 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/pom.xml +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/pom.xml @@ -7,7 +7,7 @@ com.github.drtrang druid-spring-boot-example - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot-mybatis-example diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/DruidSpringBootStarterApplication.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/DruidSpringBootStarterApplication.java similarity index 87% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/DruidSpringBootStarterApplication.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/DruidSpringBootStarterApplication.java index 174de9c..c927d81 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/DruidSpringBootStarterApplication.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/DruidSpringBootStarterApplication.java @@ -1,6 +1,6 @@ -package com.github.trang.druid; +package com.github.trang.druid.example; -import com.github.trang.druid.mapper.CityMapper; +import com.github.trang.druid.example.mapper.CityMapper; import com.google.gson.Gson; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +15,7 @@ import org.springframework.context.ApplicationContext; * @author trang */ @SpringBootApplication -@MapperScan("com.github.trang.druid.mapper") +@MapperScan("com.github.trang.druid.example.mapper") public class DruidSpringBootStarterApplication implements CommandLineRunner { public static void main(String[] args) { diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/config/DynamicDataSource.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/config/DynamicDataSource.java similarity index 96% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/config/DynamicDataSource.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/config/DynamicDataSource.java index c7672df..3c6e573 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/config/DynamicDataSource.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/config/DynamicDataSource.java @@ -1,4 +1,4 @@ -package com.github.trang.druid.config; +package com.github.trang.druid.example.config; import lombok.Getter; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/config/SpringDataSourceConfig.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/config/SpringDataSourceConfig.java similarity index 95% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/config/SpringDataSourceConfig.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/config/SpringDataSourceConfig.java index 5dbf1f7..9f0a8d0 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/config/SpringDataSourceConfig.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/config/SpringDataSourceConfig.java @@ -1,4 +1,4 @@ -package com.github.trang.druid.config; +package com.github.trang.druid.example.config; import com.alibaba.druid.pool.DruidDataSource; import lombok.extern.slf4j.Slf4j; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/controller/CityController.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/controller/CityController.java similarity index 71% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/controller/CityController.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/controller/CityController.java index a52e6a3..c3fc8b4 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/controller/CityController.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/controller/CityController.java @@ -1,7 +1,7 @@ -package com.github.trang.druid.controller; +package com.github.trang.druid.example.controller; -import com.github.trang.druid.mapper.CityMapper; -import com.github.trang.druid.model.City; +import com.github.trang.druid.example.mapper.CityMapper; +import com.github.trang.druid.example.model.City; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/mapper/CityMapper.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/mapper/CityMapper.java similarity index 80% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/mapper/CityMapper.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/mapper/CityMapper.java index a672094..55da1c1 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/mapper/CityMapper.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/mapper/CityMapper.java @@ -1,6 +1,6 @@ -package com.github.trang.druid.mapper; +package com.github.trang.druid.example.mapper; -import com.github.trang.druid.model.City; +import com.github.trang.druid.example.model.City; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/model/City.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/model/City.java similarity index 95% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/model/City.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/model/City.java index f931029..468108a 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/model/City.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/java/com/github/trang/druid/example/model/City.java @@ -1,4 +1,4 @@ -package com.github.trang.druid.model; +package com.github.trang.druid.example.model; import java.io.Serializable; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml index dd19745..a07b8cc 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml @@ -73,7 +73,7 @@ spring: preferred-json-mapper: jackson mybatis: - type-aliases-package: com.github.trang.druid.model + type-aliases-package: com.github.trang.druid.example.model --- @@ -97,10 +97,10 @@ spring: druid: # 继承 spring.datasource.druid 前缀的配置,同时可以自定义配置,若名称相同则覆盖父配置 data-sources: - master: + master-data-source: max-active: 50 max-open-prepared-statements: 50 - slave: + slave-data-source: max-active: 25 max-open-prepared-statements: 25 diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/BaseTest.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/BaseTest.java similarity index 80% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/BaseTest.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/BaseTest.java index e54510f..5eb920e 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/BaseTest.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/BaseTest.java @@ -1,6 +1,6 @@ -package com.github.trang.druid.test; +package com.github.trang.druid.example.test; -import com.github.trang.druid.mapper.CityMapper; +import com.github.trang.druid.example.mapper.CityMapper; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/DynamicDataSourceTests.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/DynamicDataSourceTests.java similarity index 98% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/DynamicDataSourceTests.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/DynamicDataSourceTests.java index 6246fc6..5313154 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/DynamicDataSourceTests.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/DynamicDataSourceTests.java @@ -1,8 +1,8 @@ -package com.github.trang.druid.test; +package com.github.trang.druid.example.test; import com.alibaba.druid.pool.DruidDataSource; import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2; -import com.github.trang.druid.config.DynamicDataSource; +import com.github.trang.druid.example.config.DynamicDataSource; import org.junit.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/MyBatisTests.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/MyBatisTests.java similarity index 83% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/MyBatisTests.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/MyBatisTests.java index c2c0f85..88be630 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/MyBatisTests.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/MyBatisTests.java @@ -1,6 +1,6 @@ -package com.github.trang.druid.test; +package com.github.trang.druid.example.test; -import com.github.trang.druid.model.City; +import com.github.trang.druid.example.model.City; import org.junit.Assert; import org.junit.Test; diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java new file mode 100644 index 0000000..64643d1 --- /dev/null +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java @@ -0,0 +1,78 @@ +package com.github.trang.druid.example.test; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.SQLUtils.FormatOption; +import com.alibaba.druid.sql.visitor.VisitorFeature; +import org.junit.Test; + +/** + * @author trang + */ +public class NormalTest { + + @Test + public void t() throws Exception { + String sql = "SELECT \n" + + " credential.housedel_code \n" + + "FROM\n" + + " sh_house_credential credential, sh_housedel house \n" + + "WHERE credential.housedel_code = house.housedel_code \n" + + " AND credential.status IN (1, 2, 5, 6) \n" + + " AND house.del_status NOT IN (0, 7) \n" + + " AND credential.id IN \n" + + " (SELECT \n" + + " MAX(id) \n" + + " FROM\n" + + " sh_house_credential inCredential, sh_housedel house \n" + + " WHERE inCredential.housedel_code = house.housedel_code \n" + + " AND inCredential.status != 0 \n" + + " AND inCredential.credential_type IN (\n" + + " 'identify', 'registerPhoto', 'registerDelPhoto', 'purchasePhoto', " + + "'houseConditionStatement', 'serviceMattersNotice'\n" + + " ) \n" + + " AND house.del_type = 2 \n" + + " AND house.office_address = 110000 \n" + + " AND house.del_status NOT IN (0, 7) \n" + + " GROUP BY inCredential.housedel_code, inCredential.credential_type) \n" + + " AND house.del_type = 2 \n" + + " AND house.office_address = 110000 \n" + + " AND credential.credential_type IN (\n" + + " 'identify', 'registerPhoto', 'registerDelPhoto', 'purchasePhoto', " + + "'houseConditionStatement', 'serviceMattersNotice'\n" + + " ) \n" + + "GROUP BY credential.housedel_code \n" + + "HAVING COUNT(\n" + + " DISTINCT \n" + + " CASE\n" + + " WHEN credential.credential_type = 'purchasePhoto' \n" + + " THEN 'registerPhoto' \n" + + " ELSE credential.credential_type \n" + + " end\n" + + " ) < 5 ;"; + FormatOption option = new FormatOption(VisitorFeature.OutputUCase, VisitorFeature.OutputDesensitize); + System.out.println(SQLUtils.formatMySql(sql, option)); + System.out.println(SQLUtils.formatMySql(sql, new FormatOption(VisitorFeature.OutputUCase))); + } + + @Test + public void hashcode() { + Hash hash = new Hash(); + Hash hash2 = new Hash(); + System.out.println(hash == hash2); + System.out.println(hash.equals(hash2)); + } + + class Hash { + @Override + public int hashCode() { + return 1; + } + + @Override + public boolean equals(Object obj) { + return true; + } + } + + +} \ No newline at end of file diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/SingleDataSourceTests.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/SingleDataSourceTests.java similarity index 96% rename from druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/SingleDataSourceTests.java rename to druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/SingleDataSourceTests.java index e4f701b..f12792f 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/test/SingleDataSourceTests.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/SingleDataSourceTests.java @@ -1,4 +1,4 @@ -package com.github.trang.druid.test; +package com.github.trang.druid.example.test; import com.alibaba.druid.pool.DruidDataSource; import org.junit.Test; diff --git a/druid-spring-boot-example/pom.xml b/druid-spring-boot-example/pom.xml index d3c0f3a..e8456fb 100644 --- a/druid-spring-boot-example/pom.xml +++ b/druid-spring-boot-example/pom.xml @@ -7,7 +7,7 @@ com.github.drtrang druid-spring-boot-parent - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot-example diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/pom.xml b/druid-spring-boot/druid-spring-boot-autoconfigure/pom.xml index ce4fd39..4e6cd5e 100644 --- a/druid-spring-boot/druid-spring-boot-autoconfigure/pom.xml +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/pom.xml @@ -7,7 +7,7 @@ com.github.drtrang druid-spring-boot - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot-autoconfigure diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java index 3d3105f..8753c7e 100644 --- a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java @@ -9,34 +9,18 @@ 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.BeansException; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.BeanFactoryAware; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.*; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.bind.PropertySourcesBinder; -import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.*; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.Environment; -import org.springframework.core.type.AnnotatedTypeMetadata; - -import javax.sql.DataSource; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import static com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties.*; @@ -49,12 +33,9 @@ import static com.github.trang.druid.autoconfigure.properties.DruidDataSourcePro @ConditionalOnClass(DruidDataSource.class) @AutoConfigureBefore(DataSourceAutoConfiguration.class) @EnableConfigurationProperties({DataSourceProperties.class, DruidDataSourceProperties.class}) -@Import({DruidServletConfiguration.class, DruidStatConfiguration.class}) +@Import({DruidDataSourceConfiguration.class, DruidServletConfiguration.class, DruidStatConfiguration.class}) @Slf4j -public class DruidAutoConfiguration implements BeanFactoryAware, EnvironmentAware { - - private DefaultListableBeanFactory beanFactory; - private ConfigurableEnvironment environment; +public class DruidAutoConfiguration { @Bean @ConditionalOnProperty(prefix = DRUID_STAT_FILTER_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) @@ -120,105 +101,4 @@ public class DruidAutoConfiguration implements BeanFactoryAware, EnvironmentAwar return new CommonsLogFilter(); } - /** - * 自动注入单数据源 - * - * @condition 1. BeanFactory 中不存在 DruidDataSource 类型的 bean - * @condition 2. BeanFactory 中不存在 'dataSource' 名称的 bean - * @condition 3. 配置文件中不存在以 'spring.datasource.druid.data-source' 开头的属性 - * @return DruidDataSource dataSource - */ - @Bean(initMethod = "init", destroyMethod = "close") - @ConditionalOnMissingBean(value = DataSource.class, name = "dataSource") - @Conditional(DataSourceCondition.class) - public DruidDataSource dataSource() { - log.debug("druid data-source init..."); - return new DruidDataSource2(); - } - - /** - * 自动注入多数据源 - * - * @condition 1. BeanFactory 中不存在 DruidDataSource 类型的 bean - * @condition 2. 配置文件中存在以 'spring.datasource.druid.data-source' 开头的属性 - * @return Map dataSourceMap/druidDataSourceMap - */ - @Bean - @Conditional(DataSourcesCondition.class) - public Map dataSourceMap(DruidDataSourceProperties druidDataSourceProperties) { - druidDataSourceProperties.getDataSources().forEach((dataSourceName, dataSourceConfig) -> { - // 构造 BeanDefinition,通过 DruidDataSource2 实现继承 'spring.datasource.druid' 的配置 - BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class) - .setInitMethodName("init") - .setDestroyMethodName("close") - .getBeanDefinition(); - // 注册 BeanDefinition - beanFactory.registerBeanDefinition(dataSourceName, beanDefinition); - String lowerCaseName = dataSourceName.toLowerCase(); - // 当 beanName 不是以 datasource 结尾时,增加别名 - if (!lowerCaseName.endsWith("datasource") && !lowerCaseName.endsWith("data-source")) { - // 注册 Alias - beanFactory.registerAlias(dataSourceName, dataSourceName + "DataSource"); - } - // 将 'spring.datasource.druid.data-sources.$dataSourceName' 的配置绑定到 Bean - DruidDataSource2 dataSource = beanFactory.getBean(dataSourceName, DruidDataSource2.class); - PropertySourcesBinder propertySourcesBinder = new PropertySourcesBinder(environment); - propertySourcesBinder.bindTo("spring.datasource.druid.data-sources." + dataSourceName, dataSource); - log.debug("druid {}-data-source init...", dataSourceName); - }); - return new HashMap<>(beanFactory.getBeansOfType(DruidDataSource2.class)); - } - - /** - * 为了便于使用,增加数据源集合,可直接注入使用 - * 如需使用 Set、Array 请注入 Set 或 DruidDataSource2[] - * - * @param dataSourceMap 多数据源 - * @return List dataSourceList - */ - @Bean - @ConditionalOnBean(name = "dataSourceMap") - @DependsOn("dataSourceMap") - public List dataSourceList(Map dataSourceMap) { - return new ArrayList<>(dataSourceMap.values()); - } - - static class DataSourceCondition extends SpringBootCondition { - - @Override - public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { - RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(context.getEnvironment(), "spring.datasource.druid."); - Map properties = resolver.getSubProperties("data-sources"); - if (!properties.isEmpty()) { - return ConditionOutcome.noMatch("find 'data-sources' properties"); - } - return ConditionOutcome.match(); - } - - } - - static class DataSourcesCondition extends SpringBootCondition { - - @Override - public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { - RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(context.getEnvironment(), "spring.datasource.druid."); - Map properties = resolver.getSubProperties("data-sources"); - if (properties.isEmpty()) { - return ConditionOutcome.noMatch("can't find 'data-sources' properties"); - } - return ConditionOutcome.match(); - } - - } - - @Override - public void setBeanFactory(BeanFactory beanFactory) throws BeansException { - this.beanFactory = (DefaultListableBeanFactory)beanFactory; - } - - @Override - public void setEnvironment(Environment environment) { - this.environment = (ConfigurableEnvironment)environment; - } - } \ No newline at end of file diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java new file mode 100644 index 0000000..28f8c87 --- /dev/null +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java @@ -0,0 +1,113 @@ +package com.github.trang.druid.autoconfigure; + +import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2; +import com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties; +import com.github.trang.druid.autoconfigure.util.CharMatcher; +import com.github.trang.druid.autoconfigure.DruidDataSourceConfiguration.DataSourceImportSelector; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.boot.bind.PropertySourcesBinder; +import org.springframework.boot.bind.RelaxedPropertyResolver; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.*; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.core.type.AnnotationMetadata; + +import java.util.Map; + +/** + * @author trang + */ +@Import({DataSourceImportSelector.class}) +@Slf4j +public class DruidDataSourceConfiguration { + + public static class SingleDataSourceRegister implements ImportBeanDefinitionRegistrar { + + static final String BEAN_NAME = "dataSource"; + + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + if (!registry.containsBeanDefinition(BEAN_NAME)) { + BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class) + .setInitMethodName("init") + .setDestroyMethodName("close") + .getBeanDefinition(); + registry.registerBeanDefinition(BEAN_NAME, beanDefinition); + log.debug("druid data-source init..."); + } + } + } + + public static class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, BeanFactoryAware, EnvironmentAware { + + private DruidDataSourceProperties druidDataSourceProperties; + private DefaultListableBeanFactory beanFactory; + private ConfigurableEnvironment environment; + + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + druidDataSourceProperties.getDataSources().forEach((dataSourceName, dataSourceConfig) -> { + // 构造 BeanDefinition,通过 DruidDataSource2 实现继承 'spring.datasource.druid' 的配置 + BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class) + .setInitMethodName("init") + .setDestroyMethodName("close") + .getBeanDefinition(); + // 注册 BeanDefinition + String beanName = CharMatcher.separatedToCamel().apply(dataSourceName); + registry.registerBeanDefinition(beanName, beanDefinition); + // 将 'spring.datasource.druid.data-sources.${name}' 的配置绑定到 Bean + DruidDataSource2 dataSource = beanFactory.getBean(beanName, DruidDataSource2.class); + PropertySourcesBinder propertySourcesBinder = new PropertySourcesBinder(environment); + propertySourcesBinder.bindTo("spring.datasource.druid.data-sources." + dataSourceName, dataSource); + log.debug("druid {}-data-source init...", dataSourceName); + }); + } + + @Autowired + public void setDruidDataSourceProperties(DruidDataSourceProperties properties) { + this.druidDataSourceProperties = properties; + } + + @Override + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + this.beanFactory = (DefaultListableBeanFactory) beanFactory; + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = (ConfigurableEnvironment) environment; + } + + } + + static class DataSourceImportSelector implements ImportSelector, EnvironmentAware { + + private ConfigurableEnvironment environment; + + @Override + public String[] selectImports(AnnotationMetadata metadata) { + RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment, "spring.datasource.druid."); + Map properties = resolver.getSubProperties("data-sources"); + if (properties.isEmpty()) { + return new String[]{DruidDataSourceProperties.class.getName(), SingleDataSourceRegister.class.getName()}; + } + return new String[]{DruidDataSourceProperties.class.getName(), DynamicDataSourceRegister.class.getName()}; + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = (ConfigurableEnvironment) environment; + } + + } + +} \ No newline at end of file diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java index fabd2ae..c9bd4c7 100644 --- a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/properties/DruidDataSourceProperties.java @@ -4,7 +4,6 @@ import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2; 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; @@ -33,17 +32,14 @@ public class DruidDataSourceProperties { public static final String DRUID_WEB_STAT_PREFIX = "spring.datasource.druid.web-stat"; public static final String DRUID_AOP_STAT_PREFIX = "spring.datasource.druid.aop-stat"; - @NestedConfigurationProperty DruidConfigFilterProperties config = new DruidConfigFilterProperties(); - @NestedConfigurationProperty DruidStatViewServletProperties statViewServlet = new DruidStatViewServletProperties(); - @NestedConfigurationProperty DruidWebStatProperties webStat = new DruidWebStatProperties(); - @NestedConfigurationProperty DruidAopStatProperties aopStat = new DruidAopStatProperties(); Map dataSources = new HashMap<>(16); - @Getter@Setter + @Getter + @Setter public static class DruidConfigFilterProperties { /** 是否开启 druid config-filter,默认否 */ private boolean enabled; diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java new file mode 100644 index 0000000..e6ab1f1 --- /dev/null +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java @@ -0,0 +1,133 @@ +package com.github.trang.druid.autoconfigure.util; + +import org.springframework.util.StringUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author trang + */ +public final class CharMatcher { + + public static Manipulation none() { + return Manipulation.NONE; + } + + public static Manipulation separatedToCamel() { + return Manipulation.SEPARATED_TO_CAMELCASE; + } + + public static enum Manipulation { + + NONE { + @Override + public String apply(String value) { + return value; + } + }, + + HYPHEN_TO_UNDERSCORE { + @Override + public String apply(String value) { + return value.indexOf('-') != -1 ? value.replace('-', '_') : value; + } + }, + + UNDERSCORE_TO_PERIOD { + @Override + public String apply(String value) { + return value.indexOf('_') != -1 ? value.replace('_', '.') : value; + } + }, + + PERIOD_TO_UNDERSCORE { + @Override + public String apply(String value) { + return value.indexOf('.') != -1 ? value.replace('.', '_') : value; + } + }, + + CAMELCASE_TO_UNDERSCORE { + @Override + public String apply(String value) { + if (value.isEmpty()) { + return value; + } + Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); + if (!matcher.find()) { + return value; + } + matcher = matcher.reset(); + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(result, matcher.group(1) + '_' + StringUtils.uncapitalize(matcher.group(2))); + } + matcher.appendTail(result); + return result.toString(); + } + }, + + CAMELCASE_TO_HYPHEN { + @Override + public String apply(String value) { + if (value.isEmpty()) { + return value; + } + Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); + if (!matcher.find()) { + return value; + } + matcher = matcher.reset(); + StringBuffer result = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(result, matcher.group(1) + '-' + + StringUtils.uncapitalize(matcher.group(2))); + } + matcher.appendTail(result); + return result.toString(); + } + }, + + SEPARATED_TO_CAMELCASE { + @Override + public String apply(String value) { + return separatedToCamelCase(value, false); + } + }, + + CASE_INSENSITIVE_SEPARATED_TO_CAMELCASE { + @Override + public String apply(String value) { + return separatedToCamelCase(value, true); + } + }; + + private static final Pattern CAMEL_CASE_PATTERN = Pattern.compile("([^A-Z-])([A-Z])"); + private static final Pattern SEPARATED_TO_CAMEL_CASE_PATTERN = Pattern.compile("[_\\-.]"); + private static final char[] SUFFIXES = new char[]{'_', '-', '.'}; + + public abstract String apply(String value); + + private static String separatedToCamelCase(String value, boolean caseInsensitive) { + if (value.isEmpty()) { + return value; + } + StringBuilder builder = new StringBuilder(); + for (String field : SEPARATED_TO_CAMEL_CASE_PATTERN.split(value)) { + field = (caseInsensitive ? field.toLowerCase() : field); + builder.append(builder.length() == 0 ? field : StringUtils.capitalize(field)); + } + char lastChar = value.charAt(value.length() - 1); + for (char suffix : SUFFIXES) { + if (lastChar == suffix) { + builder.append(suffix); + break; + } + } + return builder.toString(); + } + + } + +} \ No newline at end of file diff --git a/druid-spring-boot/druid-spring-boot-starter/pom.xml b/druid-spring-boot/druid-spring-boot-starter/pom.xml index 2c30f10..a8c7cd7 100644 --- a/druid-spring-boot/druid-spring-boot-starter/pom.xml +++ b/druid-spring-boot/druid-spring-boot-starter/pom.xml @@ -7,7 +7,7 @@ com.github.drtrang druid-spring-boot - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot-starter diff --git a/druid-spring-boot/pom.xml b/druid-spring-boot/pom.xml index 405e526..a6bf39d 100644 --- a/druid-spring-boot/pom.xml +++ b/druid-spring-boot/pom.xml @@ -7,7 +7,7 @@ com.github.drtrang druid-spring-boot-parent - 1.1.2 + 1.1.3-SNAPSHOT druid-spring-boot diff --git a/pom.xml b/pom.xml index 28eb06f..ed8f203 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.drtrang druid-spring-boot-parent - 1.1.2 + 1.1.3-SNAPSHOT pom Druid Spring Boot Starter From a7457d08d63cbfee9e24f380b5b98bec29149fca Mon Sep 17 00:00:00 2001 From: trang Date: Thu, 23 Nov 2017 17:39:29 +0800 Subject: [PATCH 2/2] 1.1.3 --- .../src/main/resources/application.yml | 4 +- .../trang/druid/example/test/NormalTest.java | 20 +-- .../autoconfigure/DruidAutoConfiguration.java | 29 ++++ .../DruidDataSourceConfiguration.java | 140 ++++++++++++------ .../druid/autoconfigure/util/CharMatcher.java | 4 + 5 files changed, 134 insertions(+), 63 deletions(-) diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml index a07b8cc..0c60b6c 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml @@ -97,10 +97,10 @@ spring: druid: # 继承 spring.datasource.druid 前缀的配置,同时可以自定义配置,若名称相同则覆盖父配置 data-sources: - master-data-source: + master: max-active: 50 max-open-prepared-statements: 50 - slave-data-source: + slave: max-active: 25 max-open-prepared-statements: 25 diff --git a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java index 64643d1..f0a837b 100644 --- a/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java +++ b/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/test/java/com/github/trang/druid/example/test/NormalTest.java @@ -56,23 +56,9 @@ public class NormalTest { @Test public void hashcode() { - Hash hash = new Hash(); - Hash hash2 = new Hash(); - System.out.println(hash == hash2); - System.out.println(hash.equals(hash2)); + String camelAlias = "XxXDatasource"; + String alias = camelAlias.substring(0, camelAlias.toLowerCase().indexOf("DataSource".toLowerCase())); + System.out.println(alias); } - class Hash { - @Override - public int hashCode() { - return 1; - } - - @Override - public boolean equals(Object obj) { - return true; - } - } - - } \ No newline at end of file diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java index 8753c7e..9ad3d08 100644 --- a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidAutoConfiguration.java @@ -9,9 +9,12 @@ 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.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @@ -20,8 +23,14 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Import; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import static com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties.*; /** @@ -101,4 +110,24 @@ public class DruidAutoConfiguration { return new CommonsLogFilter(); } + @Bean + @ConditionalOnBean(DruidDataSource.class) + public Map dataSourceMap(ConfigurableListableBeanFactory beanFactory) { + return new HashMap<>(beanFactory.getBeansOfType(DruidDataSource2.class)); + } + + /** + * 为了便于使用,增加数据源集合,可直接注入使用 + * 如需使用 Set、Array 请注入 Set 或 DruidDataSource2[] + * + * @param dataSourceMap 多数据源 + * @return List dataSourceList + */ + @Bean + @ConditionalOnBean(name = "dataSourceMap") + @DependsOn("dataSourceMap") + public List dataSourceList(Map dataSourceMap) { + return new ArrayList<>(dataSourceMap.values()); + } + } \ No newline at end of file diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java index 28f8c87..6eafae1 100644 --- a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/DruidDataSourceConfiguration.java @@ -1,22 +1,21 @@ package com.github.trang.druid.autoconfigure; -import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2; -import com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties; -import com.github.trang.druid.autoconfigure.util.CharMatcher; +import com.alibaba.druid.pool.DruidDataSource; import com.github.trang.druid.autoconfigure.DruidDataSourceConfiguration.DataSourceImportSelector; +import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2; +import com.github.trang.druid.autoconfigure.util.CharMatcher; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.BeanFactoryAware; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.bind.PropertySourcesBinder; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.context.annotation.ImportSelector; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotationMetadata; @@ -24,18 +23,25 @@ import org.springframework.core.type.AnnotationMetadata; import java.util.Map; /** + * Druid 数据源配置 + * * @author trang */ -@Import({DataSourceImportSelector.class}) +@Import(DataSourceImportSelector.class) @Slf4j public class DruidDataSourceConfiguration { - public static class SingleDataSourceRegister implements ImportBeanDefinitionRegistrar { + /** + * 单数据源注册 + * + * @author trang + */ + static class SingleDataSourceRegister implements ImportBeanDefinitionRegistrar { static final String BEAN_NAME = "dataSource"; @Override - public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { if (!registry.containsBeanDefinition(BEAN_NAME)) { BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class) .setInitMethodName("init") @@ -47,48 +53,62 @@ public class DruidDataSourceConfiguration { } } - public static class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, BeanFactoryAware, EnvironmentAware { + /** + * 多数据源注册 + * + * @author trang + */ + static class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware { - private DruidDataSourceProperties druidDataSourceProperties; - private DefaultListableBeanFactory beanFactory; - private ConfigurableEnvironment environment; + private static final String BEAN_SUFFIX = "DataSource"; + private RelaxedPropertyResolver resolver; @Override - public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { - druidDataSourceProperties.getDataSources().forEach((dataSourceName, dataSourceConfig) -> { - // 构造 BeanDefinition,通过 DruidDataSource2 实现继承 'spring.datasource.druid' 的配置 - BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class) - .setInitMethodName("init") - .setDestroyMethodName("close") - .getBeanDefinition(); - // 注册 BeanDefinition - String beanName = CharMatcher.separatedToCamel().apply(dataSourceName); - registry.registerBeanDefinition(beanName, beanDefinition); - // 将 'spring.datasource.druid.data-sources.${name}' 的配置绑定到 Bean - DruidDataSource2 dataSource = beanFactory.getBean(beanName, DruidDataSource2.class); - PropertySourcesBinder propertySourcesBinder = new PropertySourcesBinder(environment); - propertySourcesBinder.bindTo("spring.datasource.druid.data-sources." + dataSourceName, dataSource); - log.debug("druid {}-data-source init...", dataSourceName); - }); - } - - @Autowired - public void setDruidDataSourceProperties(DruidDataSourceProperties properties) { - this.druidDataSourceProperties = properties; - } - - @Override - public void setBeanFactory(BeanFactory beanFactory) throws BeansException { - this.beanFactory = (DefaultListableBeanFactory) beanFactory; + public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { + resolver.getSubProperties("").keySet().stream() + .map(key -> key.substring(0, key.indexOf("."))) + .distinct() + .forEach(dataSourceName -> { + // 构造 BeanDefinition,通过 DruidDataSource2 实现继承 'spring.datasource.druid' 的配置 + BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class) + .setInitMethodName("init") + .setDestroyMethodName("close") + .getBeanDefinition(); + // 注册 BeanDefinition + registry.registerBeanDefinition(dataSourceName, beanDefinition); + // 注册驼峰别名 + String camelAlias = CharMatcher.separatedToCamel().apply(dataSourceName); + registry.registerAlias(dataSourceName, camelAlias); + // 注册以 DataSource 为后缀的别名 + String otherAlias; + if (camelAlias.toLowerCase().endsWith(BEAN_SUFFIX.toLowerCase())) { + if (!camelAlias.endsWith(BEAN_SUFFIX)) { + otherAlias = camelAlias.substring(0, camelAlias.toLowerCase().indexOf(BEAN_SUFFIX.toLowerCase())); + otherAlias = otherAlias + BEAN_SUFFIX; + registry.registerAlias(dataSourceName, otherAlias); + } + } else { + otherAlias = camelAlias + BEAN_SUFFIX; + registry.registerAlias(dataSourceName, otherAlias); + } + log.debug("druid {}-data-source init...", dataSourceName); + }); } @Override public void setEnvironment(Environment environment) { - this.environment = (ConfigurableEnvironment) environment; + this.resolver = new RelaxedPropertyResolver(environment, "spring.datasource.druid.data-sources."); } } + /** + * 数据源选择器 + * 当配置文件中存在 spring.datasource.druid.data-sources 属性时为多数据源 + * 不存在则为单数据源 + * + * @author trang + */ static class DataSourceImportSelector implements ImportSelector, EnvironmentAware { private ConfigurableEnvironment environment; @@ -98,9 +118,41 @@ public class DruidDataSourceConfiguration { RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment, "spring.datasource.druid."); Map properties = resolver.getSubProperties("data-sources"); if (properties.isEmpty()) { - return new String[]{DruidDataSourceProperties.class.getName(), SingleDataSourceRegister.class.getName()}; + return new String[]{SingleDataSourceRegister.class.getName()}; } - return new String[]{DruidDataSourceProperties.class.getName(), DynamicDataSourceRegister.class.getName()}; + return new String[]{DynamicDataSourceRegister.class.getName(), + DataSourceBeanPostProcessor.class.getName()}; + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = (ConfigurableEnvironment) environment; + } + + } + + /** + * DataSource Bean 处理器 + * + * @author trang + */ + static class DataSourceBeanPostProcessor implements BeanPostProcessor, EnvironmentAware { + + private ConfigurableEnvironment environment; + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof DruidDataSource) { + // 将 'spring.datasource.druid.data-sources.${name}' 的配置绑定到 Bean + PropertySourcesBinder binder = new PropertySourcesBinder(environment); + binder.bindTo("spring.datasource.druid.data-sources." + beanName, bean); + } + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; } @Override diff --git a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java index e6ab1f1..25afce9 100644 --- a/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java +++ b/druid-spring-boot/druid-spring-boot-autoconfigure/src/main/java/com/github/trang/druid/autoconfigure/util/CharMatcher.java @@ -18,6 +18,10 @@ public final class CharMatcher { return Manipulation.SEPARATED_TO_CAMELCASE; } + public static Manipulation camelToHyphen() { + return Manipulation.CAMELCASE_TO_HYPHEN; + } + public static enum Manipulation { NONE {