Marco's Java【SpringBoot進階(三) 之 SpringBoot數據源配置和自動管理】

前言

學習SpringBoot也有些時間了,之前咱們一直接觸的都是SpringMVC的層面,沒有涉及到數據庫,那麼從本節開始呢,我們會着重來講解SpringBoot如何結合數據庫使用。

我們先從開胃菜開始吧~

配置dbcp數據源

翻過我的 Marco’s Java【SpringMVC番外篇 之 Druid的內置監控配置】 這篇博文的朋友想必對數據源的概念不陌生了,在這裏我也不過多去贅述什麼是數據源,之前咱們要使用數據庫是必須在application-dao.xml配置文件中配置,非常繁瑣。因此SpringBoot幫我們大大的簡化了數據源的配置,相信能翻到這篇博文的 “老油條” 們,應該很清楚SpringBoot的一大特色,就是自動配置!
那麼我們的數據源是不是也被自動裝配了呢?根據之前的經驗,咱們來搜搜看,有沒有DataSourceAutoConfig這樣的類吧~
在這裏插入圖片描述
果不其然,一發擊中(呵呵) !
在這裏插入圖片描述
每個配置類中肯定會有一個配置文件類,我們找找,發現有一個DataSourceProperties,咱們點進去看看
在這裏插入圖片描述
發現@ConfigurationProperties(prefix = "spring.datasource"),因此可以推斷,我們在yml文件中使用頭部 "spring.datasource"就可以對SpringBoot中數據源的默認參數進行修改了

好啦,講了這麼久,咱們來個小栗子實操一下吧,我這裏就以dbcp數據源爲例子,dbcp會了,c3p0使用起來也是一樣的~
首先,導入操作數據庫的jdbc啓動裝置,以及連接mysql數據庫的驅動裝置。
在這裏插入圖片描述
在這裏插入圖片描述
接着我們引入dbcp的數據源
在這裏插入圖片描述
然後在yml中配置數據源(大家可以試試,配置dbcp時會有自動提示的)

#配置數據源
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/userinfo
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: password
    type: org.apache.commons.dbcp2.BasicDataSource

注意了,這裏的配置com.mysql.cj.jdbc.Driver是因爲我的mysql驅動mysql-connector-java是6.0以上的版本(需要指定時區serverTimezone)

接着咱們來測試一下,數據源是否配置成功
在這裏插入圖片描述
數據源的內存地址被成功打印出來了,說明數據源獲取沒有問題!
在這裏插入圖片描述

配置Druid數據源

設置Druid的數據源和上面的方式略微有點區別,具體的區別在哪我們還是在栗子中慢慢挖掘出來
第一步:創建項目並配置依賴
此次項目因爲要連接到數據庫,因此,我們需要添加數據庫驅動包,創建項目的時候在Available中搜索mysql,勾選Mysql Driver就可以啦
在這裏插入圖片描述
添加之後在我們的pom.xml文件中會多出對mysql數據庫的依賴jar包
在這裏插入圖片描述
第二步:修改pom引入jdbc的啓動器
添加完數據庫的連接包之後,還有一個和數據庫相關的非常重的jar包需要導入,就是Spring的jdbc包,我們按照以下方式引入,因爲SpringBoot默認聲明瞭版本號,因此,這裏的配置也不需要添加version
在這裏插入圖片描述
第三步:添加Druid的數據源依賴
打開druid-1.1.19.jar,我們可以找到Druid的數據源DruidDataSource,查看DruidDataSource的源碼,本質上它就是DataSource接口的實現類
在這裏插入圖片描述
其實大家實驗過會發現,當我們在yml文件中,添加druid的數據源DruidDataSource之後,想配置該數據源中的屬性值時,yml文件並不會給到相關的屬性名稱的提示,這是因爲在SpringBoot中並沒有添加Druid數據源的自動配置類,因此,我們需要手動的去創建這麼一個配置類。那麼再次之前,咱們先導入對druid數據源的依賴。
在這裏插入圖片描述
第四步:創建DruidAutoConfiguration配置類
大家請看,上面提到了,當我們引入DruidDataSource之後,並沒有發現druid的相關配置,因此我們得手動得去創建DruidAutoConfiguration配置類
在這裏插入圖片描述
以下是配置類代碼,其實原理很簡單,無非就是把我們之前xml得druid配置給搬到DruidAutoConfiguration中,如果之前沒有接觸過Druid或者Druid得配置已經忘得差不多得朋友,可以先閱覽我之前的博文
Marco’s Java【SpringMVC番外篇 之 Druid的內置監控配置】

package com.marco.config;

import java.sql.SQLException;
import java.util.Map;

import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

@Configuration
@ConditionalOnWebApplication(type=Type.SERVLET)
@ConfigurationProperties("spring.datasource.druid") //採用被動注入值得方式
public class DruidAutoConfig {
	
	private static final String USER_SESSION = "USER_SESSION";
	private static final String USER_COOKIE = "USER_COOKIE";
	private static final String WEB_STAT_FILTER = "webStatFilter";
	private static final String STAT_VIEW_SERVLET = "statViewServlet";
	
	
	/**
	 * 獲取druidDataSource對象
	 * @return
	 */
	@Bean(initMethod="init")
	@ConfigurationProperties("spring.datasource")
	public DruidDataSource getDruidDataSource() {
		DruidDataSource druidDataSource = new DruidDataSource();
		try {
			druidDataSource.setFilters(filters);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return druidDataSource;
	}
	
	/**********監控頁面的配置**************/
	private String filters = "stat";
	private String loginUserName = "root";
	private String loginPassword = "zcq774798947";
	private String allow = "";
	private String deny = "";
	private String druidUrl = "/druid/*";
	private String exclusions = "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*";
	private String profileEnable = "true";
	private	String principalCookieName = USER_COOKIE;
	private String principalSessionName = USER_SESSION;
	/**
	 * 註冊StatViewServlet
	 * @return
	 */
	@Bean(STAT_VIEW_SERVLET)
	public ServletRegistrationBean<StatViewServlet> getServletRegistrationBean() {
		//創建StatViewServlet
		StatViewServlet statViewServlet = new StatViewServlet();
		//創建StatViewServlet的註冊器
		ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<StatViewServlet>();
		//注入StatViewServlet
		registrationBean.setServlet(statViewServlet);
		
		//注入初始化值
		registrationBean.addInitParameter("loginUserName", loginUserName);
		registrationBean.addInitParameter("loginPassword", loginPassword);
		registrationBean.addInitParameter("allow", allow);
		registrationBean.addInitParameter("deny", deny);
		//添加映射路徑
		registrationBean.addUrlMappings(druidUrl);
		return registrationBean;
	}
	
	/**
	 * 註冊WebStatFilter
	 * @return
	 */
	@Bean(WEB_STAT_FILTER)
	public FilterRegistrationBean<WebStatFilter> getFilterRegistrationBean() {
		//創建WebStatFilter
		WebStatFilter webStatFilter = new WebStatFilter();
		//創建WebStatFilter的註冊器
		FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<WebStatFilter>();
		//注入webStatFilter
		registrationBean.setFilter(webStatFilter);
		//注入初始化值
		registrationBean.addInitParameter("exclusions", exclusions);
		registrationBean.addInitParameter("profileEnable", profileEnable);
		registrationBean.addInitParameter("principalCookieName", principalCookieName);
		registrationBean.addInitParameter("principalSessionName", principalSessionName);
		
		//添加對statViewServlet的映射關聯
		registrationBean.addServletNames(STAT_VIEW_SERVLET);
		return registrationBean;
	}
	
	/**********成員屬性的get/set方法**************/
	public String getFilters() {
		return filters;
	}

	public void setFilters(String filters) {
		this.filters = filters;
	}

	public String getLoginUserName() {
		return loginUserName;
	}

	public void setLoginUserName(String loginUserName) {
		this.loginUserName = loginUserName;
	}

	public String getLoginPassword() {
		return loginPassword;
	}

	public void setLoginPassword(String loginPassword) {
		this.loginPassword = loginPassword;
	}

	public String getAllow() {
		return allow;
	}

	public void setAllow(String allow) {
		this.allow = allow;
	}

	public String getDeny() {
		return deny;
	}

	public void setDeny(String deny) {
		this.deny = deny;
	}

	public String getDruidUrl() {
		return druidUrl;
	}

	public void setDruidUrl(String druidUrl) {
		this.druidUrl = druidUrl;
	}

	public String getExclusions() {
		return exclusions;
	}

	public void setExclusions(String exclusions) {
		this.exclusions = exclusions;
	}

	public String getProfileEnable() {
		return profileEnable;
	}

	public void setProfileEnable(String profileEnable) {
		this.profileEnable = profileEnable;
	}

	public String getPrincipalCookieName() {
		return principalCookieName;
	}

	public void setPrincipalCookieName(String principalCookieName) {
		this.principalCookieName = principalCookieName;
	}

	public String getPrincipalSessionName() {
		return principalSessionName;
	}

	public void setPrincipalSessionName(String principalSessionName) {
		this.principalSessionName = principalSessionName;
	}
	
}

大家可以看到我們上面得配置類是通過註解@ConfigurationProperties("spring.datasource.druid"),採用被動注入值的方式獲取我們yml配置文件中的值,再給對應的屬性注入值,其實講了這麼久的SpringBoot,應該很熟悉這種方式了,這可謂是SpringBoot的一大特色!

第五步:編寫yml配置文件
接下來最後一步,編寫yml配置文件,我們的配置文件也分爲兩大塊,一部分是數據源的基本配置,包括數據源4要素,最大活躍連接量等等,再者就是Druid所獨有的監控頁面的配置

spring:
#數據源創建4要素
datasource:
  url: jdbc:mysql://127.0.0.1:3306/user #注意這裏的數據庫一定要存在
  driver-class-name: com.mysql.cj.jdbc.Driver
  username: root
  password: password
  #設置數據源類型
  type: com.alibaba.druid.pool.DruidDataSource
  max-active: 10 #最大活躍連接量
  max-wait: 5 #最大等待量
  validation-query: select 'x' #配合定期檢查的sql,每隔一段時間檢查sql是否正常
  keep-alive: true #定期檢查開啓
  druid:
    ## 監控頁面的配置
    filters: stat
    login-user-name: root
    login-password: password
    allow: #白名單
    deny: #黑名單
    druid-url: /druid/*
    exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
    principal-cookie-name: USER_COOKIE
    principal-session-name: USER_SESSION
    profile-enable: true      

第六步:測試
咱們先在測試類中打印這個數據源看看,數據源是否能成功獲取到!

package com.marco;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootDatasourceApplicationTests {

	@Autowired
	private DataSource dataSource;
	
	@Test
	public void contextLoads() {
		System.out.println(dataSource);
	}
}

成功打印出來了,沒有問題!那我們啓動SpringBoot項目,看看是否能進入Druid數據源的監控界面吧~
在這裏插入圖片描述
Ok,監控頁面也可以順利打開,大家可以發現,這裏面很多數據都是我們在yml文件中已經配置過的,比如說最大連接數,MaxWait,數據庫連接地址等等,我就不帶着大家一個個的看啦~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章