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方式进行配置