通过 starter 整合 Druid
# 500.通过 starter 整合 Druid
本文讲讲如何通过 starter 的方式,来整合 Druid
# 引入依赖
在 GitHub (opens new window) 里,已经有一个 starter 的目录,我们点下面那个:
然后就可以看到文档了:
我们引入 starter,并将之前的 Druid 依赖注释掉:
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>druid</artifactId>-->
<!-- <version>1.2.6</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
除此之外,将之前的配置类注释掉:
//@Configuration
public class MyDataSourceConfig {
2
# 自动配置功能分析
引入后,可以看到其已经引入了 Druid,还有日志框架、自动配置:
我们打开这个包,能看到有个自动配置类 DruidDataSourceAutoConfigure
:
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
public DruidDataSourceAutoConfigure() {
}
@Bean(
initMethod = "init"
)
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
代码分析:
首先
@Configuration
说明这是一个配置类@ConditionalOnClass({DruidDataSource.class})
说明得有 Druid 的 DataSource,才会生效@AutoConfigureBefore({DataSourceAutoConfiguration.class})
说明得在 SpringBoot 自动配置数据源之前,配置,目的是在官方的数据源之前,注入 Druid 自己的数据源@EnableConfigurationProperties
还是和配置文件中spring.datasource
开头的配置进行绑定,额外的配置则是spring.datasource.druid
还@Import 了如下类:
- DruidSpringAopConfiguration:监控 Spring 相关的配置,上一篇博客中提到过
- DruidStatViewServletConfiguration:Druid 监控页的配置,默认开启
- DruidWebStatFilterConfiguration:web 应用的监控,默认开启
- DruidFilterConfiguration:其他监控,例如 SQL 监控,防火墙等
DruidStatViewServletConfiguration
类的部分源码:可以看到是还是使用了 ServletRegistrationBean
,并且配置了一些默认值。
也可通过配置文件的方式来绑定属性,其前缀是 spring.datasource.druid.stat-view-servlet
@ConditionalOnWebApplication
@ConditionalOnProperty(
name = {"spring.datasource.druid.stat-view-servlet.enabled"},
havingValue = "true"
)
public class DruidStatViewServletConfiguration {
private static final String DEFAULT_ALLOW_IP = "127.0.0.1";
public DruidStatViewServletConfiguration() {
}
@Bean
public ServletRegistrationBean statViewServletRegistrationBean(DruidStatProperties properties) {
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.setServlet(new StatViewServlet());
registrationBean.addUrlMappings(new String[]{config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"});
if (config.getAllow() != null) {
registrationBean.addInitParameter("allow", config.getAllow());
} else {
registrationBean.addInitParameter("allow", "127.0.0.1");
}
if (config.getDeny() != null) {
registrationBean.addInitParameter("deny", config.getDeny());
}
if (config.getLoginUsername() != null) {
registrationBean.addInitParameter("loginUsername", config.getLoginUsername());
}
if (config.getLoginPassword() != null) {
registrationBean.addInitParameter("loginPassword", config.getLoginPassword());
}
if (config.getResetEnable() != null) {
registrationBean.addInitParameter("resetEnable", config.getResetEnable());
}
return registrationBean;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
通过源码可以得出,相关的配置 prefix 如下:
DruidSpringAopConfiguration
:spring.datasource.druid.aop-patterns
DruidStatViewServletConfiguration
:spring.datasource.druid.stat-view-servlet
DruidWebStatFilterConfiguration
;spring.datasource.druid.web-stat-filter
# 开始配置
修改 application.yml:
spring:
datasource:
url: jdbc:mysql://localhost:3306/learnjdbc?serverTimezone=UTC
username: learn
password: learnpassword
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
filter: stat,wall
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin
reset-enable: false
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
filters: stat,wall #stat监控统计,wall防火墙
filter: #配置具体的filter
stat:
slow-sql-millis: 1000 #慢查询时间
wall:
enabled: true
config:
drop-table-allow: false #是否允许删除表
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
关于 reset-enable:就是重置功能,禁用后点击重置,之前的数据不会被删除
其实在文档中,有很多的例子,有需要的可以去参考下:
配置完后,我们重启,测试一下相关功能,一般是没问题的。
# 源码
已将本文源码上传到 Gitee (opens new window) 或 GitHub (opens new window) 的分支 demo11,读者可以通过切换分支来查看本文的示例代码