SpringBoot數據訪問之Druid啟動器的使用


數據訪問之Druid啟動器的使用

承接上文:SpringBoot數據訪問之Druid數據源的自定義使用

官方文檔:

Druid Spring Boot Starter

首先在在 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中的自動配置(兩種方式):

  1. 可以雙擊shift打開搜索找到DruidDataSourceAutoConfigure
  2. image-20210806161823666

源碼分析:

為什么導入啟動器就能使用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)
  1. 當容器中有這個類
  2. 后面的內容在這個類(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對應功能

image-20210806170156460

該類是配置Spring的監控的,點擊進入,可以看到相關的設置:

@Bean
@ConditionalOnProperty(name = "spring.aop.auto",havingValue = "false")
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
    DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
    advisorAutoProxyCreator.setProxyTargetClass(true);
    return advisorAutoProxyCreator;
}

與我們手動配置的如出一轍,不明白的朋友可以簡單了解z下之前的文章:

  1. 掘金: SpringBoot數據訪問之自定義Druid
  2. 個人博客:SpringBoot數據訪問之自定義Druid

通過該類上的屬性配置進行屬性綁定,@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中的配置:

image-20210806171124269

基本上也是如出一轍,自定義的功能比較單一。

所以我們使用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可以使用。

image-20210806215242510

參考:

havingValue

Druid Spring Boot Starter

SpringBoot2零基礎入門springboot全套完整版

結束:

如果你看到這里或者正好對你有所幫助,希望能點個關注或者推薦,感謝;

有錯誤的地方,歡迎在評論指出,作者看到會進行修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM