Skip to content

Commit 401e6dc

Browse files
committed
ApiBoot DataSource Switch 自动化配置添加
1 parent f39ef54 commit 401e6dc

File tree

5 files changed

+191
-3
lines changed

5 files changed

+191
-3
lines changed

api-boot-project/api-boot-autoconfigure/pom.xml

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>api-boot-parent</artifactId>
77
<groupId>org.minbox.framework</groupId>
8-
<version>1.0.2.RELEASE</version>
8+
<version>1.0.3.RELEASE</version>
99
<relativePath>../api-boot-parent</relativePath>
1010
</parent>
1111
<modelVersion>4.0.0</modelVersion>
@@ -41,6 +41,13 @@
4141
<optional>true</optional>
4242
</dependency>
4343

44+
<!--SpringBoot Jdbc-->
45+
<dependency>
46+
<groupId>org.springframework.boot</groupId>
47+
<artifactId>spring-boot-starter-jdbc</artifactId>
48+
<optional>true</optional>
49+
</dependency>
50+
4451
<!--Swagger-->
4552
<dependency>
4653
<groupId>io.springfox</groupId>
@@ -117,5 +124,22 @@
117124
<optional>true</optional>
118125
</dependency>
119126

127+
<!--ApiBoot DataSource Switch Plugin-->
128+
<dependency>
129+
<groupId>org.minbox.framework</groupId>
130+
<artifactId>api-boot-plugin-datasource-switch</artifactId>
131+
<optional>true</optional>
132+
</dependency>
133+
<dependency>
134+
<groupId>com.alibaba</groupId>
135+
<artifactId>druid</artifactId>
136+
<optional>true</optional>
137+
</dependency>
138+
<dependency>
139+
<groupId>com.zaxxer</groupId>
140+
<artifactId>HikariCP</artifactId>
141+
<optional>true</optional>
142+
</dependency>
143+
120144
</dependencies>
121145
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package org.minbox.framework.api.boot.autoconfigure.datasource;
2+
3+
import org.minbox.framework.api.boot.plugin.datasource.ApiBootDataSource;
4+
import org.minbox.framework.api.boot.plugin.datasource.ApiBootDataSourceFactoryBean;
5+
import org.minbox.framework.api.boot.plugin.datasource.aop.advistor.ApiBootDataSourceSwitchAdvisor;
6+
import org.minbox.framework.api.boot.plugin.datasource.aop.interceptor.ApiBootDataSourceSwitchAnnotationInterceptor;
7+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceConfig;
8+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceDruidConfig;
9+
import org.minbox.framework.api.boot.plugin.datasource.routing.ApiBootRoutingDataSource;
10+
import org.minbox.framework.api.boot.plugin.datasource.support.ApiBootDruidDataSource;
11+
import org.minbox.framework.api.boot.plugin.datasource.support.ApiBootHikariDataSource;
12+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
14+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
15+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
16+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
17+
import org.springframework.context.annotation.Bean;
18+
import org.springframework.context.annotation.Configuration;
19+
20+
import javax.sql.DataSource;
21+
import java.util.HashMap;
22+
import java.util.LinkedList;
23+
import java.util.List;
24+
import java.util.Map;
25+
26+
/**
27+
* ApiBoot DataSource Switch AutoConfiguration
28+
*
29+
* @author:恒宇少年 - 于起宇
30+
* <p>
31+
* DateTime:2019-04-01 22:06
32+
* Blog:http://blog.yuqiyu.com
33+
* WebSite:http://www.jianshu.com/u/092df3f77bca
34+
* Gitee:https://gitee.com/hengboy
35+
* GitHub:https://github.com/hengboy
36+
*/
37+
@Configuration
38+
@ConditionalOnClass(ApiBootDataSource.class)
39+
@EnableConfigurationProperties(ApiBootDataSourceSwitchProperties.class)
40+
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
41+
public class ApiBootDataSourceSwitchAutoConfiguration {
42+
/**
43+
* ApiBoot DataSource Switch Properties
44+
*/
45+
private ApiBootDataSourceSwitchProperties apiBootDataSourceSwitchProperties;
46+
47+
public ApiBootDataSourceSwitchAutoConfiguration(ApiBootDataSourceSwitchProperties apiBootDataSourceSwitchProperties) {
48+
this.apiBootDataSourceSwitchProperties = apiBootDataSourceSwitchProperties;
49+
}
50+
51+
/**
52+
* ApiBoot DataSource FactoryBean
53+
* Used to create datasource
54+
*
55+
* @return ApiBootDataSourceFactoryBean
56+
*/
57+
@Bean
58+
@ConditionalOnMissingBean
59+
public ApiBootDataSourceFactoryBean apiBootDataSourceFactoryBean() {
60+
return new ApiBootDataSourceFactoryBean();
61+
}
62+
63+
/**
64+
* ApiBoot Routing DataSource
65+
* switch use datasource
66+
*
67+
* @param apiBootDataSourceFactoryBean ApiBoot DataSource FactoryBean
68+
* @return
69+
*/
70+
@Bean
71+
@ConditionalOnMissingBean
72+
public DataSource dataSource(ApiBootDataSourceFactoryBean apiBootDataSourceFactoryBean) {
73+
List<DataSourceConfig> dataSourceConfigList = new LinkedList();
74+
Map<String, DataSourceConfig> dataSourceConfigMap = new HashMap(1);
75+
76+
// put druid datasource config to map
77+
dataSourceConfigMap.putAll(apiBootDataSourceSwitchProperties.getDruid());
78+
// put hikari datasource config to map
79+
dataSourceConfigMap.putAll(apiBootDataSourceSwitchProperties.getHikari());
80+
81+
// convert all datasource config
82+
dataSourceConfigMap.keySet().stream().forEach(poolName -> {
83+
DataSourceConfig dataSourceConfig = dataSourceConfigMap.get(poolName);
84+
// set data source pool name
85+
dataSourceConfig.setPoolName(poolName);
86+
// datasource type
87+
dataSourceConfig.setDataSourceType(dataSourceConfig instanceof DataSourceDruidConfig ? ApiBootDruidDataSource.class : ApiBootHikariDataSource.class);
88+
89+
// after convert add to data source list
90+
dataSourceConfigList.add(dataSourceConfig);
91+
});
92+
93+
return new ApiBootRoutingDataSource(apiBootDataSourceFactoryBean, apiBootDataSourceSwitchProperties.getPrimary(), dataSourceConfigList);
94+
}
95+
96+
/**
97+
* ApiBoot DataSource Switch Advice Interceptor
98+
*
99+
* @return ApiBootDataSourceSwitchAnnotationInterceptor
100+
*/
101+
@Bean
102+
@ConditionalOnMissingBean
103+
public ApiBootDataSourceSwitchAnnotationInterceptor apiBootDataSourceSwitchAnnotationInterceptor() {
104+
return new ApiBootDataSourceSwitchAnnotationInterceptor();
105+
}
106+
107+
/**
108+
* ApiBoot DataSource Switch Advisor
109+
* Used to get @DataSourceSwitch annotation define
110+
*
111+
* @return ApiBootDataSourceSwitchAdvisor
112+
*/
113+
@Bean
114+
@ConditionalOnMissingBean
115+
public ApiBootDataSourceSwitchAdvisor apiBootDataSourceSwitchAdvisor(ApiBootDataSourceSwitchAnnotationInterceptor apiBootDataSourceSwitchAnnotationInterceptor) {
116+
return new ApiBootDataSourceSwitchAdvisor(apiBootDataSourceSwitchAnnotationInterceptor);
117+
}
118+
119+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.minbox.framework.api.boot.autoconfigure.datasource;
2+
3+
import lombok.Data;
4+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceDruidConfig;
5+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceHikariConfig;
6+
import org.springframework.boot.context.properties.ConfigurationProperties;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
12+
import static org.minbox.framework.api.boot.autoconfigure.datasource.ApiBootDataSourceSwitchProperties.API_BOOT_DATASOURCE_SWITCH_PREFIX;
13+
14+
/**
15+
* @author:恒宇少年 - 于起宇
16+
* <p>
17+
* DateTime:2019-04-02 09:48
18+
* Blog:http://blog.yuqiyu.com
19+
* WebSite:http://www.jianshu.com/u/092df3f77bca
20+
* Gitee:https://gitee.com/hengboy
21+
* GitHub:https://github.com/hengboy
22+
*/
23+
@Data
24+
@Configuration
25+
@ConfigurationProperties(prefix = API_BOOT_DATASOURCE_SWITCH_PREFIX)
26+
public class ApiBootDataSourceSwitchProperties {
27+
/**
28+
* ApiBoot DataSource Switch Config Prefix
29+
*/
30+
public static final String API_BOOT_DATASOURCE_SWITCH_PREFIX = "api.boot.datasource";
31+
/**
32+
* primary datasource pool name
33+
* default is master
34+
*/
35+
private String primary = "master";
36+
/**
37+
* config druid type datasource list
38+
*/
39+
public Map<String, DataSourceDruidConfig> druid = new HashMap();
40+
/**
41+
* config hikari type datasource list
42+
*/
43+
public Map<String, DataSourceHikariConfig> hikari = new HashMap();
44+
}

api-boot-project/api-boot-autoconfigure/src/main/java/org/minbox/framework/api/boot/autoconfigure/swagger/SwaggerProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class SwaggerProperties {
4545
/**
4646
* 文档版本号
4747
*/
48-
private String version = "1.0.2.RELEASE";
48+
private String version = "1.0.3.RELEASE";
4949
/**
5050
* 文档版权
5151
*/

api-boot-project/api-boot-autoconfigure/src/main/resources/META-INF/spring.factories

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
88
org.minbox.framework.api.boot.autoconfigure.oauth.ApiBootAuthorizationServerJdbcAutoConfiguration,\
99
org.minbox.framework.api.boot.autoconfigure.oauth.ApiBootAuthorizationServerMemoryAutoConfiguration,\
1010
org.minbox.framework.api.boot.autoconfigure.oauth.ApiBootResourceServerAutoConfiguration,\
11-
org.minbox.framework.api.boot.autoconfigure.quartz.ApiBootQuartzAutoConfiguration
11+
org.minbox.framework.api.boot.autoconfigure.quartz.ApiBootQuartzAutoConfiguration,\
12+
org.minbox.framework.api.boot.autoconfigure.datasource.ApiBootDataSourceSwitchAutoConfiguration

0 commit comments

Comments
 (0)