From c71ff62251d8fa97cde9446cd2df4423217eb1fc Mon Sep 17 00:00:00 2001 From: Trang Date: Fri, 17 Nov 2017 18:18:06 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Druid=20=E5=A4=9A=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E6=94=AF=E6=8C=81.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Druid 多数据源支持.md | 40 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/docs/Druid 多数据源支持.md b/docs/Druid 多数据源支持.md index 192b3ca..905a1c7 100644 --- a/docs/Druid 多数据源支持.md +++ b/docs/Druid 多数据源支持.md @@ -1,37 +1,40 @@ # Druid 多数据源支持 -1.0.2 版本新增了支持多数据源的 **DruidDataSource2**,可以将 `spring.datasource` 和 `spring.datasource.druid` 开头的配置注入到数据源,解决各数据源之间的相同配置问题。 +1.0.2 版本新增了支持多数据源的 DruidDataSource2,Starter 可以自动将 `spring.datasource` 和 `spring.datasource.druid` 开头的属性注入到每一个数据源,用户只需要声明每个数据源单独的属性即可。 -1.1.2 版本改进了多数据源的注册方式,由 Starter 自动发现配置并注册到 Spring Context,用户只需在配置文件中声明即可。 +1.1.2 版本则更进一步,改进了多数据源的注册方式,无需任何代码,由 Starter 自动发现配置并注册到 Spring Context,旨在简化开发人员的劳动力。 ## 使用方式 -编辑配置文件,Starter 会将 `spring.datasource.druid.data-sources` 开头的的属性注入到 Map 中,从而构建多数据源。 +编辑 application 配置文件,Starter 会将 `spring.datasource.druid.data-sources` 开头的的属性注入到 Map 中,并根据该 Map 构建数据源。 ```yaml spring: autoconfigure: - exclude: +    ## 多数据源环境下必须排除掉 DataSourceAutoConfiguration,否则会导致循环依赖报错 +    exclude: - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration datasource: - driver-class-name: org.h2.Driver +    ## 以 'spring.datasource' 和 'spring.datasource.druid' 开头的属性会作为公共配置,注入到每一个数据源 +    driver-class-name: org.h2.Driver username: root password: 123456 druid: - # 多数据源的标识,若该属性存在则为多数据源环境 - data-sources: - ## master 数据源的配置,以下为 master 数据源独有的配置 + username: root + password: 123456 +      ## 多数据源的标识,若该属性存在则为多数据源环境,不存在则为单数据源环境 +      data-sources: + ### master 数据源的配置,以下为 master 数据源独有的配置 master: url: jdbc:h2:file:./master - ## slave 数据源的配置,以下为 slave 数据源独有的配置 + ### slave 数据源的配置,以下为 slave 数据源独有的配置 slave: url: jdbc:h2:file:./slave ``` 注: 排除 `org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration` 有两种方式,以下方式任选其一即可: - -```yaml + 1. 在 `@SpringBootApplication` 注解中排除 ```java @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @@ -46,8 +49,12 @@ spring: ## 原理 -DruidDataSource2Support 类存在的目的是为了注入 `spring.datasource` 和 `spring.datasource.druid` 的配置。 -基于 Spring4 的特性,DruidDataSource2 在继承 DruidDataSource2Support 的同时,也会继承这些配置,由此解决多数据源场景下相同配置重复定义的问题。 +### 公共配置 +多数据源其实很好实现,编写 N 个数据源的配置,并且声明 N 个 Bean 即可,但带来的一个问题是各数据源之间存在大量相同的配置,每个数据源全部声明一遍既繁琐又无用,为了解决这个问题,Starter 中新增了两个类:DruidDataSource2 和 DruidDataSource2Support。 + +其中 DruidDataSource2Support 是个抽象类,继承自 com.alibaba.druid.pool.DruidDataSource,主要作用是自动注入 `spring.datasource` 和 `spring.datasource.druid` 开头的属性,并作为 parent bean 为各个数据源实例提供公共配置。 + +DruidDataSource2 继承自 DruidDataSource2Support,内部没有任何代码,目的是继承 DruidDataSource2Support 中的已注入的配置,同时可以注入各数据源单独的配置,如遇到相同的属性会覆盖父类的同名属性。 也就是说,以下两种方式是等价的: @@ -83,5 +90,12 @@ spring: url: jdbc:h2:file:./slave ``` +### 自动配置 + +Starter 判断是否多数据源的条件是 application 文件中是否存在 `spring.datasource.druid.data-sources` 属性,若存在即为多数据源环境,不存在则为单数据源环境。 + +多数据源环境下,Starter 会将 `spring.datasource.druid.data-sources` 开头的属性注入到 Map 中,然后遍历该 Map,并通过构造 BeanDefinition 的方式来构造各个数据源,最后通过 PropertySourcesBinder 将各数据源单独的属性注入到各数据源。 + + ## 演示 将 [druid-spring-boot-example](https://github.com/drtrang/druid-spring-boot/blob/master/druid-spring-boot-example/druid-spring-boot-mybatis-example/src/main/resources/application.yml) 的 `spring.profiles.active` 配置改为 `dynamic` 即可。