一、闲话
国庆回来搬家去了,还联系上了七天班,所以偷懒了,今天继续学习Spring Boot
二、自定义整合方式
Spring Boot整合第三方技术有2种方式:自定义方式和利用starter
我们先了解一下自定义方式,首先引入相关依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
然后声明一个配置类,使用@Bean注入一个DataSource
类型的组件
在上一篇博客【Spring Boot】DataSource数据源的自动配置解析中,我们通过分析DataSourceAutoConfiguration
可以得知,系统的默认数据源HikariDataSource
生效要求系统中没有DataSource.class类型的bean
package com.decade.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class MyDataSourceConfig {
@Bean
// 也可以使用@ConfigurationProperties注解直接获取配置文件中的属性
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
final DruidDataSource druidDataSource = new DruidDataSource();
// 可以自己设置数据源相关属性
// druidDataSource.setUrl("");
// druidDataSource.setUsername("");
// druidDataSource.setPassword("");
return druidDataSource;
}
}
然后我们使用之前的测试类进行测试
package com.decade;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@SpringBootTest
@Slf4j
class SpringbootWebApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private DataSource dataSource;
@Test
void contextLoads() {
final Long count = jdbcTemplate.queryForObject("select count(*) from t_decade_user", Long.class);
log.info("该表中数据总数为{}", count);
log.info("系统使用的数据源为:{}", dataSource.getClass().getName());
}
}
验证效果如下,查询数据正常且使用的是druid数据源
除了基本的连接配置,druid还提供了很多其他的功能,可以参考官方文档
1、内置的监控页面
在以前的SSM框架的项目中,我们需要在web.xml文件中配置一个servlet
现在使用Spring Boot框架之后,这些都可以交给配置类来做
参考之前的博客【Spring Boot】Web原生组件注入
我们可以使用ServletRegistrationBean将Servlet注册到容器中
@Bean
public ServletRegistrationBean statViewServlet() {
final StatViewServlet statViewServlet = new StatViewServlet();
final ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(statViewServlet, "/druid/*");
// 设置监控页的登录账号
servletRegistrationBean.addInitParameter("loginUsername", "user");
servletRegistrationBean.addInitParameter("loginPassword", "123456");
return servletRegistrationBean;
}
然后我们就可以通过http://localhost:8080/druid/index.html访问druid的内置监控页面
2、开启SQL监控统计功能stat
和防火墙wall
根据druid的官方文档可知,开启SQL监控和防火墙需要设置过滤器,所以我们还是要调整配置类
@Bean
// 也可以使用@ConfigurationProperties注解直接获取配置文件中的属性
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() throws SQLException {
final DruidDataSource druidDataSource = new DruidDataSource();
// 可以自己设置数据源相关属性
// druidDataSource.setUrl("");
// druidDataSource.setUsername("");
// druidDataSource.setPassword("");
// 开启监控功能
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
接着我们写一个接口去测试一下
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/query")
@ResponseBody
public String queryInfo() {
final Long count = jdbcTemplate.queryForObject("select count(*) from t_decade_user", Long.class);
return String.valueOf(count);
}
调用接口后,可以查看到SQL的执行情况
以及防火墙
3、配置web和jdbc的监控
我们需要在配置类中定义一个过滤器,设置要监控的请求路径
@Bean
public FilterRegistrationBean webStatFilter() {
final WebStatFilter webStatFilter = new WebStatFilter();
final FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
webStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
return webStatFilterFilterRegistrationBean;
}
执行上面的/query
请求后,效果如下
此外,druid还有监控spring等配置,具体的可以参考上面的文档,然后通过配置类实现原来xml文件同样的配置
三、使用starter启动器整合
使用starter启动器也可以整合druid数据源
我们只需要导入相关依赖即可
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
然后我们可以看下对应自动配置类的代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.alibaba.druid.spring.boot.autoconfigure;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidFilterConfiguration;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidSpringAopConfiguration;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidStatViewServletConfiguration;
import com.alibaba.druid.spring.boot.autoconfigure.stat.DruidWebStatFilterConfiguration;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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;
@Configuration
// 当系统中存在DruidDataSource类型的组件时才会生效
@ConditionalOnClass({DruidDataSource.class})
// 在系统默认的数据源自动配置类之前生效
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
// 配置项以spring.datasource.druid和spring.datasource开头
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
// 自定义整合方式中开启SQL监控、防火墙等配置都在这些类中
@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();
}
}
分析完相关源码之后,我们就可以通过配置项来实现和上面自定义整合方式相同的功能了
spring:
datasource:
url: jdbc:mysql://localhost:3306/decade_test?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.decade.* #监控SpringBean
filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)
stat-view-servlet: # 配置监控页功能
enabled: true
login-username: user #监控页登录账号
login-password: 123456 # 监控页登陆密码
resetEnable: true #重置按钮是否生效
web-stat-filter: # 监控web
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter:
stat: # 对上面filters里面的stat的详细配置,也就是SQL监控的配置
slow-sql-millis: 1000 # 慢SQL的时间,1000ms
logSlowSql: true # 记录慢SQL
enabled: true
wall: # 防火墙相关设置
enabled: true
config:
drop-table-allow: false # 禁止删表操作
验证结果如下,druid相关功能正常
如有错误,欢迎指正!!!