Spring Boot 学习(一) 整合Druid数据源
- 自定义
1.引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.17</version> </dependency>
2.写一个自己的配置类
分析:
在springboot中自动配置源是根据判断是否含有数据源,再进行默认数据源的创建,导入了默认配置Hikari
DataSourceAutoConfigration 里面进行判断是否含有数据源
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
如果没有数据源则进行默认配置,导入了默认数据源 Hikari
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
点进去Hikari里面可以发现里面有@Bean 里面放了一个Hikari的数据源
条件判断:
@ConditionalOnMissingBean(DataSource.class)
static class Hikari { @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") HikariDataSource dataSource(DataSourceProperties properties) { HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class); if (StringUtils.hasText(properties.getName())) { dataSource.setPoolName(properties.getName()); } return dataSource; } }
在自己建的config类中添加数据源组件,因为声明了为容器,所以在这里不会触发默认数据源配置,因为配置了数据源一定要配置数据库信息,所以这里一一配置的方式比较麻烦,可以通过注解@ConfigrationProperties("")来进行组件内容与配置文件的绑定
package com.sp.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 { @ConfigurationProperties("spring.datasource") // 把组件里的内容与配置文件进行绑定,即spring下的datasource下的内容进行绑定 @Bean public DataSource dataSource() { //进行了DataSource设置为组件,此时容器中有了数据源 //@ConditionalOnMissingBean(DataSource.class) 在原来的Hikari中是没有才会配置,Hikari的数据源 //因为这里写了@Bean,所以Hikari的不会生效 DruidDataSource druidDataSource = new DruidDataSource(); // 这里的信息可以通过注解来进行配置@ConfigurationProperties // druidDataSource.setUrl(); // druidDataSource.setUsername(); // druidDataSource.setPassword(); return druidDataSource; //返回的数据源是druid } }
测试
package com.sp; 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; @Slf4j @SpringBootTest class BootWeb01ApplicationTests { @Autowired //自动注入 JdbcTemplate jdbcTemplate; @Autowired DataSource dataSource; @Test void contextLoads() { Long aLong = jdbcTemplate.queryForObject("select count(*) from whole",Long.class); System.out.println(aLong); log.info("记录总数:{}",aLong); log.info("数据源类型是{}",dataSource.getClass()); } }

配置监控页功能
在配置类中添加如下信息
@Bean public ServletRegistrationBean statViewServlet() { /* 配置druid的监控页功能 */ StatViewServlet statViewServlet = new StatViewServlet(); ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<StatViewServlet>(statViewServlet,"/druid/*");//表示拦截的路径 return registrationBean; }
之后进行测试
浏览器输入http://localhost:8080/world/druid/index.html 可以访问到监控页面

之后写一个测试Controller
@Autowired //因为容器中已经有了JdbcTemplate JdbcTemplate jdbcTemplate; @ResponseBody //返回的数据在页面上进行显示 @GetMapping("/sql") public String getSql() { Long aLong = jdbcTemplate.queryForObject("select count(*) from whole",Long.class); //进行jdbctemplate事务的查询功能 return aLong.toString(); }


但是发现在druid的监控页面上没有显示,原因在于:只开启了监控页功能,没有开启监控功能,所以接下来要配置监控统计功能
在MyDataSourceConfig类里面的datasource方法添加下面的方法即可
druidDataSource.setFilters("stat");
@ConfigurationProperties("spring.datasource")
// 把组件里的内容与配置文件进行绑定,即spring下的datasource下的内容进行绑定
@Bean
public DataSource dataSource() throws SQLException {
//@ConditionalOnMissingBean(DataSource.class) 在原来的Hikari中是没有才会配置,Hikari的数据源
//因为这里写了@Bean,所以Hikari的不会生效
DruidDataSource druidDataSource = new DruidDataSource();
/*
配置监控统计功能
*/
druidDataSource.setFilters("stat"); //多个值用逗号分隔即可,例如还想要开启防火墙 stat,wall 即可
// 这里的信息可以通过注解来进行配置@ConfigurationProperties
// druidDataSource.setUrl();
// druidDataSource.setUsername();
// druidDataSource.setPassword();
return druidDataSource;
}

完整config代码
package com.sp.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; import java.sql.SQLException; @Configuration public class MyDataSourceConfig { @ConfigurationProperties("spring.datasource") // 把组件里的内容与配置文件进行绑定,即spring下的datasource下的内容进行绑定 @Bean public DataSource dataSource() throws SQLException { //@ConditionalOnMissingBean(DataSource.class) 在原来的Hikari中是没有才会配置,Hikari的数据源 //因为这里写了@Bean,所以Hikari的不会生效 DruidDataSource druidDataSource = new DruidDataSource(); /* 配置监控统计功能 */ druidDataSource.setFilters("stat"); // 这里的信息可以通过注解来进行配置@ConfigurationProperties // druidDataSource.setUrl(); // druidDataSource.setUsername(); // druidDataSource.setPassword(); return druidDataSource; } @Bean public ServletRegistrationBean statViewServlet() { /* 配置druid的监控页功能 */ StatViewServlet statViewServlet = new StatViewServlet(); ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<StatViewServlet>(statViewServlet,"/druid/*"); return registrationBean; } }
添加对应的web功能
根据官方文档https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter
有 init-param 的配置,以及value的配置
filter-name的配置
官方文档中关于web.xml的配置信息
<filter> <filter-name>DruidWebStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
springboot中config里面添加如下信息
// WebStatFilter 用于采集Web-jdbc关联数据 @Bean public FilterRegistrationBean webStatFilter() { WebStatFilter webStatFilter = new WebStatFilter(); FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter); filterRegistrationBean.setUrlPatterns(Arrays.asList("/*")); //拦截所有路径 filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); //排除静态资源 return filterRegistrationBean; }
此时web信息可以正常显示


为监控界面添加保护机制,账号密码功能
在监控页配置信息处添加
registrationBean.addInitParameter("loginUsername","admin");
registrationBean.addInitParameter("loginPassword","123456");
@Bean public ServletRegistrationBean statViewServlet() { /* 配置druid的监控页功能 */ StatViewServlet statViewServlet = new StatViewServlet(); ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<StatViewServlet>(statViewServlet,"/druid/*"); registrationBean.addInitParameter("loginUsername","admin"); registrationBean.addInitParameter("loginPassword","123456"); return registrationBean; }
注意也可以在yaml中配置,因为是setXXXX这种在注解中已经进行了绑定
例如在配置stat和wall的时候可以在yaml中进行编写@ConfigurationProperties("spring.datasource") 此注解已经跟yaml进行了绑定
druidDataSource.setFilters("stat,wall");
spring:
datasource:
filters: stat,wall
- starter方式进行配置
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency>
通过观察druid的autoconfigration发现,扩展配置项是:spring.datasource.druid
DruidDataSourceAutoConfigure -> DruidStatProperties
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
有自动配置类和DruidStatProperties配置类,
其中DruidDataSourceAutoConfigure 导入了四个类
@Import({DruidSpringAopConfiguration.class, //用来监控spring组件也就是SpringBean 配置项:@ConditionalOnProperty({"spring.datasource.druid.aop-patterns"})
DruidStatViewServletConfiguration.class, //与监控页有关的配置@ConditionalOnProperty(name = {"spring.datasource.druid.stat-view-servlet.enabled"},havingValue = "true")
DruidWebStatFilterConfiguration.class, //Web监控的配置 已经配置了filter @ConditionalOnProperty(name = {"spring.datasource.druid.web-stat-filter.enabled"},havingValue = "true")
DruidFilterConfiguration.class}) //所有Druid自己的filter配置
绑定的配置项
private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat"; private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config"; private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding"; private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j"; private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j"; private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2"; private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log"; private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall"; private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";
在yaml文件中对上面4个类分别进行配置
对于配置文件的配如下:对于Druid的所有功能配置都可以在配置文件中进行配置,因为有设置注解配置,即配置文件进行了绑定@ConditionalOnProperty
spring:
mvc:
hiddenmethod:
filter:
enabled: true
resources:
static-locations: [classpath:/templates,classpath:/static,classpath:/public]
datasource:
url: jdbc:mysql://localhost:3306/yschoolmall?characterEncoding=utf8&useSSL=true
username: root
password: 5892
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.sp.* #对springBean的监控 项目名com下的sp文件夹下的所有(监控springBean)
filters: stat,wall,slf4j #要开启的功能 stat:sql监控功能 wall : 防火墙监控功能 slf4j:进行记录
filter:
stat: #对开启的功能进行详细配置
slow-sql-millis: 1000 #1000毫秒的为慢查询..
enabled: true #开启功能
log-slow-sql: true
wall:
enabled: true
config:
update-allow: true #允许更新操作
delete-allow: false #不允许进行删表的操作
stat-view-servlet: #监控页功能
enabled: true #默认是false的这里一定要开启
login-username: admin
login-password: 123456
web-stat-filter: #用于监控web应用
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
jdbc:
template:
query-timeout: 5
server:
servlet:
context-path: /world
# 设置服务器访问路径
每一个功能都能找到对应的配置项

浙公网安备 33010602011771号