數據訪問之Druid啟動器的使用
官方文檔:
首先在在 Spring Boot 項目中加入
druid-spring-boot-starter依賴 。
博主版本:1.1.17 SpriongBoot:2.5.3
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>版本號</version>
</dependency>
我們來看下Druid中的自動配置(兩種方式):
- 可以雙擊shift打開搜索找到DruidDataSourceAutoConfigure

源碼分析:
為什么導入啟動器就能使用Druid數據源。
@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);
@Bean(initMethod = "init")
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
}
看以下兩個注解:
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
- 當容器中有這個類
- 后面的內容在這個類(DataSourceAutoConfiguration.class)之前執行
為什么這樣設置呢?
進入DataSourceAutoConfiguration類后找到引入的DataSourceConfiguration.Hikari.class,。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true)
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;
}
}
由上述代碼可以發現,默認的配置源是HikariDataSource,但是有一個要求:
@ConditionalOnMissingBean(DataSource.class)
就是如果在容器中沒有數據源,下面代碼生效,也就是使用HikariDataSource,但是若容器中已經有開發者創建的數據源,那么開發者創建的優先。
所以Druid的創建必須要在默認源之前聲明,如果在默認源之后聲明,Druid數據源將不生效,由於Druid的自動配置決定的:
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
ConditionalOnMissingBean:容器中已經有了默認源的話,那么Druid的源是不生效的。
功能實現介紹:
查看具體的功能只要分析它導入了哪些類就能明白它所實現的功能。
- DruidSpringAopConfiguration.class,
- DruidStatViewServletConfiguration.class,
- DruidWebStatFilterConfiguration.class,
- DruidFilterConfiguration.class
DruidSpringAopConfiguration對應功能

該類是配置Spring的監控的,點擊進入,可以看到相關的設置:
@Bean
@ConditionalOnProperty(name = "spring.aop.auto",havingValue = "false")
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
與我們手動配置的如出一轍,不明白的朋友可以簡單了解z下之前的文章:
通過該類上的屬性配置進行屬性綁定,@ConditionalOnProperty("spring.datasource.druid.aop-patterns")
配置項:spring.datasource.druid.aop-patterns
所以我們可以在application.yaml文件中配置Springd監控的功能。
DruidStatViewServletConfiguration
該類是實現開啟監控頁的功能,相當於我們之前寫的StatViewServlet
自定義寫法:
/**
* 配置監控頁
*/
@Bean
public ServletRegistrationBean staViewServlet(){
//實例化StatViewServlet
StatViewServlet statViewServlet = new StatViewServlet();
//將實例化的實例化StatViewServlet 傳入ServletRegistrationBean,並設置訪問路徑
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
return registrationBean;
}
Druid-start中的配置:

基本上也是如出一轍,自定義的功能比較單一。
所以我們使用Druid-start來簡化我們之前的操作,可以通過DruidStatViewServletConfiguration中的配置屬性配置:
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true")
配置項:spring.datasource.druid.stat-view-servlet.enabled。
擴展(havingValue):
@ConditionalOnProperty,這個注解能夠控制某個configuration是否生效。具體操作是通過其兩個屬性name以及havingValue來實現的,其中name用來從application.properties中讀取某個屬性值,如果該值為空,則返回false;如果值不為空,則將該值與havingValue指定的值進行比較,如果一樣則返回true;否則返回false。如果返回值為false,則該configuration不生效;為true則生效
通過上述文章的所說,SpringBoot首先會去spring.datasource.druid.stat-view-servlet該配置項中找到enabled的值是什么,如果該值與havingValue指定的值進行比較,一樣則返回true,這樣該Bean就會生效,也就是該組件或者功能開啟。在配置文件中我們設置后可以佐證該結論是否正確。
后面兩個類也基本是相同的方法,各位自行查看,在此省略。
DruidWebStatFilterConfiguration //web應用開啟DruidFilterConfiguration //Filter開啟
開啟配置屬性:
配置必須屬性:
spring: datasource: url: jdbc:mysql://localhost:3306/vuesite username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
開啟監控頁:
開啟監控頁也就是增加StatViewServlet組件。
spring: datasource: url: jdbc:mysql://localhost:3306/vuesite username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver druid: stat-view-servlet: enabled: true
我們看一下enabled的默認配置,點擊enabled,找到私有屬性可知:
/** * Enable StatViewServlet, default false. */private boolean enabled;
默認為false,這也就佐證了上述的結論。
完整的yaml基本配置如下:
spring: datasource: url: jdbc:mysql://localhost:3306/vuesite username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver druid: aop-patterns: com.xbhog.* filters: stat,wall # 底層開啟功能,stat(sql監控),wall(防火牆) stat-view-servlet: # 配置監控頁功能 enabled: true login-username: admin login-password: admin resetEnable: false web-stat-filter: # 監控web enabled: true urlPattern: /* exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' filter: stat: #對上面filters里面的stat的詳細配置 slow-sql-millis: 1000 logSlowSql: true enabled: true wall: enabled: true config: drop-table-allow: false
因為我們監控主要事情是sql,所以測試功能的時候需要發送一個controller sql.如下代碼:
@Controllerpublic class Mycontro { @Autowired JdbcTemplate jdbcTemplate; @ResponseBody //不經過視圖解析器 @GetMapping("/sql") public String druidquery(){ Long aLong = jdbcTemplate.queryForObject("select count(*) from user",Long.class); return aLong.toString(); }}
在配置的時候出現的錯誤
aop-patterns配置好以后,打開界面刷新,發現並沒有生效,也就是沒有監控到。
在網上找了很多方法,也看了官方文檔,還是不行。
最后使用了原始的方法,降版本號,親測在 Druid在1.1.17可以使用。

參考:
SpringBoot2零基礎入門springboot全套完整版
結束:
如果你看到這里或者正好對你有所幫助,希望能點個關注或者推薦,感謝;
有錯誤的地方,歡迎在評論指出,作者看到會進行修改。
