SpringBoot學習筆記

微服務階段

  • JavaSE:面向對象
  • MySql + JDBC:持久化存儲
  • html + css +JavaScript + Jquery + 框架:視圖,框架
  • JavaWeb:開始獨立開發MVC三層架構的網站(原始)
  • SSM:框架(簡化瞭我們的開發流程,配置也開始較為復雜)
  • war:Tomcat運行
  • Spring再簡化:SpringBoot – Jar(內嵌Tomcat)- 微服務架構

    SpringCloud

Spring

Spring是一個開源框架,2003年興起的一個輕量級的Java開發框架。Spring是為瞭解決企業級應用開發的復雜性而創建的,簡化開發

為瞭降低Java開發的復雜性,Spring采用瞭以下4種關鍵策略:

  • 1、基於POJO的輕量級和最小侵入性編程
  • 2、通過IOC,依賴註入(DI)和面向接口實現松耦合;
  • 3、基於切面(AOP)和慣例進行聲明式編程
  • 4、通過切面和模板減少樣式代碼

核心思想:約定大於配置!!!

(程序猿)程序 = 數據結構 + 算法(集合框架)

(碼農)程序 = 面向對象 + 框架


微服務架構

微服務是一種架構風格,它要求我們在開發一個應用的時候,這個應用必須構建一系列小服務的組合;可以通過http方式進行互通。要說微服務架構,先得說說過去我們的單體應用架構

單體應用架構:

  • 所謂單體應用架構(all in one)是指,我們將一個應用的中的所有應用服務都封裝在一個應用中。
  • 無論是ERP、CRM或是其他什麼系統,你都把數據庫訪問,web訪問,等等各個功能放到一個war包內
  • 這樣做的好處是:易於開發和測試;也十分方便部署;當需要擴展時,隻需要將war復制多份,然後放到多個服務器上,再做個負載均衡就可以瞭。
  • 單體應用框架的缺點是:哪怕我要修改一個非常小的地方,我都需要停掉整個服務、重新打包、部署這個應用war包。特別是對於一個大型應用,我們不可能把所有內容放在一個應用裡面,我們如何維護、如何分工合作都是問題

微服務架構:

  • all in one的架構方式,我們把所有的功能單元放在一個應用裡面。然後我們把整個應用部署到服務器上。如果負載能力不行,我們將整個應用進行水平復制,進行擴展,然後在負載均衡。
  • 所謂微服務架構,就是打破之前all in one的架構方式,把每個功能元素獨立出來。把獨立出來的功能元素的動態組合,需要的功能元素才去拿來組合,需要多一些時可以整合多個功能元素。所以微服務架構是對功能元素進行復制,而沒有對整個應用復制
  • 這樣做的好處:
    • 1、節省瞭調用資源
    • 2、每個功能元素的服務都是一個可替換的、可獨立升級的軟件代碼

高內聚,低耦合!!!


如何構建微服務

一個大型系統的微服務架構,就像一個復雜交織的神經網絡,每一個神經元就是一個功能元素,它們各自完成自己的功能,然後通過http相互請求調用。比如一個電商系統,查緩存、連數據庫、瀏覽頁面、結賬、支付等服務都是一個個獨立的功能服務,都被微化瞭,它們作為一個個微服務共同構建一個龐大的系統。如果修改其中的一個功能,隻需要更新升級其中一個功能服務單元即可。

但是這種龐大的系統架構給部署和運維帶來很大的難度。於是,Spring為我們帶來瞭構建大型分佈式微服務的全套、全程產品:

  • 構建一個個功能獨立的微服務應用單元,可以使用SpringBoot,可以幫我們快速構建一個應用;
  • 大型分佈式網絡服務的調用,這部分由Spring Cloud來實現,實現分佈式;
  • 在分佈式中間,進行流式數據計算、批處理,我們有Spring Cloud Data Flow。
  • Spring為我們想清楚瞭整個從開始構建應用到大型分佈式應用全流程方案。

第一個SpringBoot程序

官方:提供一個快速生成的網站,IDEA集成瞭這個網站

  • 可以在官網直接下載後,導入idea開發(官網在哪)
  • 可以直接使用idea創建一個SpringBoot項目(一般開發直接在IDEA中創建)

官網網址:https://spring.io/projects/spring-boot

進入官網後,點擊Spring Initializr


在官網配置好項目後,就可以點擊下面的 GENERATE CTRL + 回車
。然後會得到一個項目壓縮包,解壓後,就可以導入到 idea 中。


如果是在idea工具裡面進行配置的話,一定要註意,下載來源不要默認,而要加上阿裡雲鏡像!!!!


後面的過程就和官網配置頁面設置一樣,選好後,就可以進入到項目中編寫瞭。

package com.blb.demo.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controller@RequestMapping("/hello")public class HelloController {    @GetMapping("/hello")    @ResponseBody    public String hello(){        return "hello,world";    }}

當我們寫好第一個接口後,就可以在本地上跑一下瞭

成功!!!

細節講解:

  • @RequestMapping():註解映射請求路徑
  • @GetMapping和@PostMapping
    • 從命名約定我們可以看到每個註釋都是為瞭處理各自的傳入請求方法類型,即@GetMapping用於處理請求方法的GET類型,@PostMapping用於處理請求方法的POST類型等。

    • 如果我們想使用傳統的@RequestMapping註釋實現URL處理程序,那麼它應該是這樣的:

      @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
    • 新方法可以簡化為:

      @GetMapping("/get/{id}")

@responseBody註解的作用是:

  • 將controller的方法返回的對象通過適當的轉換器轉換為指定的格式之後,寫入到response對象的body區,通常用來返回JSON數據或者是XML數據。
  • 註意:在使用此註解之後不會再走視圖處理器,而是直接將數據寫入到輸入流中,他的效果等同於通過response對象輸出指定格式的數據

原理初探

自動配置:

  • pom.xml
    • spring-boot-dependencies:核心依賴在父工程中
    • 我們在寫或者引入一些SpringBoot依賴的時候,不需要指定版本,就因為有這些版本倉庫

啟動器:

<dependency><groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId></dependency>
  • 啟動器就是SpringBoot的啟動場景
  • 比如spring-boot-starter-web,他就會幫我們自動導入web環境所有的依賴!
  • SpringBoot會將所有的功能場景,都變成一個個的啟動器
  • 我們要使用什麼功能,就隻需要找到對應的啟動器就可以瞭 starter

主程序:

package com.blb.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;// @SpringBootApplication : 標註這個類是一個SpringBoot的應用(啟動類下的所有資源被導入)@SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {    // 將SpringBoot應用啟動        SpringApplication.run(DemoApplication.class, args);    }}
  • 註解
    • @SpringBootConfiguration:SpringBoot的配置
      • @Configuration:Spring配置類
      • @Component:說明這也是一個Spring的組件
    • @EnableAutoConfiguration:自動配置
      • @AutoConfigurationPackage:自動配置包
        • @Import({AutoConfigurationPackages.Registrar.class}):自動配置 包註冊
      • @Import(AutoConfigurationImportSelector.class):自動導入選擇
      • 獲取所有的配置:
        • List configurations = getCandidateConfigurations(annotationMetadata, attributes);

獲取候選的配置:

  • 方法getCandidateConfigurations()返回瞭自動配置類的信息列表,而它通過調用SpringFactoriesLoader.loadFactoryNames()來掃描加載含有META-INF/spring.factories文件的jar包,該文件記錄瞭具有哪些自動配置類
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;}

META-INF/spring.factories:自動配置的核心文件

所有資源加載到配置類中!

Properties properties = PropertiesLoaderUtils.loadProperties(resource);

結論:SpringBoot所有自動配置都是在啟動的時候掃描並加載(spring.factories所有的自動配置類都在這裡面,但是不一定生效,要判斷條件是否成立,隻要導入瞭對應的start,就有對應的啟動器瞭,有瞭啟動器,我們自動裝配就會生效,然後就配置成功!)

  • 1、SpringBoot在啟動的時候,從類路徑下 /META-INF/spring.factories獲取指定的值;
  • 2、將這些自動配置的類導入容器,自動配置就會生效,幫我進行自動配置
  • 3、以前我們需要自動配置的東西,現在SpringBoot幫我們做瞭!
  • 4、整個JavaEE,解決方案和自動配置的東西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar這個包下
  • 5、它會把所有需要導入的組件,以類名的方式返回,這些組件就會被添加到容器;
  • 6、容器中也會存在非常多的xxxAutoConfiguration@Bean的文件,就是這些類給容器中導入瞭這個場景需要的所有組件;並自動配置。@Configuration,JavaConfig!
  • 7、有瞭自動配置類,免去瞭我們手動編寫配置文件的工作瞭!

SpringApplication.run(主程序類)分析:分析該方法主要分為兩部分

  • 1、SpringApplication的實例化
    • new SpringApplication(主程序類)
      • 判斷是否web應用
      • 加載並保存所有ApplicationContextInitializer(META-INF/spring.factories)
      • 加載並保存所有ApplicationListener
      • 獲取到主程序類
  • 2、run方法的執行
    • run()
      • 回調所有的SpringApplicationRunListener(META-INF/spring.factories)的starting
      • 獲取ApplicationArguments
      • 準備環境和所有監聽器(SpringApplicationRunListener)的environmentPrepared
      • 打印banner信息
      • 創建ioc容器對象
        • AnnotationConfigEmbeddedWebApplicationContext(Web環境容器)
        • AnnotationConfigApplicationContext(普通環境容器)

SpringApplication:這個類主要做瞭以下四件事情

  • 1、推斷應用的類型是普通的項目還是Web項目
  • 2、查找並加載所有可用初始化器,設置到initializers屬性中
  • 3、找出所有的應用程序監聽器,設置到listeners屬性中
  • 4、推斷並設置main方法的定義類,找到運行的主類

查看構造器:

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {// 設置一些默認參數        this.sources = new LinkedHashSet();        this.bannerMode = Mode.CONSOLE;        this.logStartupInfo = true;        this.addCommandLineProperties = true;        this.addConversionService = true;        this.headless = true;        this.registerShutdownHook = true;        this.additionalProfiles = new HashSet();        this.isCustomEnvironment = false;        this.lazyInitialization = false;        this.resourceLoader = resourceLoader;        Assert.notNull(primarySources, "PrimarySources must not be null");// 保存主配置類到一個Set集合primarySources中        this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));                // 獲取當前的應用類型,判斷是不是Web應用         this.webApplicationType = WebApplicationType.deduceFromClasspath();// 從類路徑下找到META-INF/spring.factories配置的所有ApplicationContextInitializer;然後保存起來                this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));// 從類路徑下找到META‐INF/spring.ApplicationListener;然後保存起來,原理同上        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));        // 從多個配置類中找到有main方法的主配置類。在調run方法的時候是可以傳遞多個配置類的        this.mainApplicationClass = this.deduceMainApplicationClass();        // 執行完畢,SpringApplication對象就創建出來瞭,返回到1處,調用SpringApplication對象的run方法,到3    }

SpringBoot:配置文件及自動配置原理

配置文件:SpringBoot使用一個全局的配置文件,配置文件名稱是固定的

  • application.properties
    • 語法結構:key = value
  • application.yaml
    • 語法結構:key: 空格 value

配置文件的作用:修改SpringBoot自動配置的默認值,因為SpringBoot在底層都給我們自動配置好瞭;


YAML

YAML是”YAML Ain’t a Markup Language”(YAML不是一種標記語言)的遞歸縮寫。在開發的這種語言時,YAML 的意思其實是:“Yet Another Markup Language”(仍是一種標記語言),但為瞭強調這種語言以數據做為中心,而不是以標記語言為重點,而用反向縮略語重命名。(取自百度百科)

標記語言:以前的配置文件,大多數都是使用xml來配置;比如一個簡單的端口配置,我們來對比下yaml和xml

  • yaml配置:

    server:port: 8080// 普通的key-valuename: huake// 對象student:name: huakeage: 3// 行內寫法studednt: {name: huake, age: 3}// 數組pets:  - cat  - dog  - pigpets: [cat, dog, pig]
  • xml配置:

    <server><port>8080</port></server>
  • properties隻能寫鍵值對

    name=huakestudent.name = huakestudent.age = 3

YAML語法

基本語法:

k:(空格) v

以此來表示一對鍵值對(空格不能省略);以空格的縮進來控制層級關系,隻要是左邊對齊的一列數據都是同一個層級的。

註意:屬性和值的大小寫都是十分敏感的。例如:

server:port: 8080path: /hello

值的寫法:字面量: 普通的值 [數字, 佈爾值, 字符串]

k: v

字面量直接寫在後面就可以,字符串默認不用加上雙引號或者單引號;”” 雙引號,不會轉義字符串裡面的特殊字符,特殊字符會作為本身想表示的意思;

比如:name: "kuang \n shen"

輸出:

kuangshen

yaml可以直接給實體類賦值:

  • 首先介紹一下原生的賦值方式:
    • 先創建一個類
    • @component是spring中的一個註解,它的作用就是實現bean的註入(註冊bean
    • @Value是一個賦值註解
    • @Autowired是用在JavaBean中的註解,通過byType形式,用來給指定的字段或方法註入所需的外部資源
    • 經過測試,我們拿到瞭實例化後的值;
  • 接下來就是通過yaml文件來進行賦值:
    • 同樣先創建好我們的類

    • 在yaml文件進行對應類型賦值

    • 最後進行測試,發現數據都得到瞭

    • 打印結果

      Person{name='huake', age=3,happy=true,birth=Fri Jan 07 00:00:00 CST 2022,maps={k1=v1, k2=v2},lists=[code, music, girl],dog=Dog{name='旺財', age=3}}

@ConfigurationProperties作用:

  • 將配置文件中配置的每一個屬性值,映射到這個組件中;
  • 告訴SpringBoot將本類中的所有屬性和配置文件中國相關的配置進行綁定
  • 參數 prefix = “person” (將配置文件中的person下面的所有屬性一一對應)
  • 隻有這個組件是容器中的組件,才能使用容器提供的@ConfigurationProperties功能

上面采用的方法都是最簡單的方式,開發中最常用的;那我們來嘮叨一下其他的實現方式,道理都是相通的,寫還是那樣寫;配置文件除瞭yaml還有我們之前常用的properties,但properties配置文件在寫中文的時候,會有亂碼,我們需要去IDEA中設置編碼格式為UTF-8;

@ConfigurationProperties @Value
功能 批量註入配置文件中的屬性 一個個指定
松散綁定(松散語法) 支持 不支持
SpEL 不支持 支持
JSR303數據校驗 支持 不支持
復雜類型封裝 支持 不支持
  • cp隻需要寫一次即可,value則需要每個字段都添加
  • 松散綁定:比如我的yaml中寫的last-name,這個和lastName是一樣的,- 後面跟著的字母默認是大寫的。這就是松散綁定
  • JSR303數據校驗:這個就是我們可以在字段是增加一層過濾器驗證,可以保證數據的合法性
  • 復雜類型封裝,yaml中可以封裝對象,使用@Value就不支持

結論:

  • 配置yaml和配置properties都可以獲取到值,強烈推薦yaml
  • 如果我們在某個業務中,隻需要獲取配置文件中的某個值,可以使用 @Value
  • 如果說,我們專門編寫瞭一個JavaBean來和配置文件進行映射,就直接使用 @ConfigurationProperties,不要猶豫!!!

JSR303數據校驗(瞭解即可):

SpringBoot中可以用@validated來校驗數據,如果數據異常則會統一拋出異常,方便異常中心統一處理。

  • 我們這裡來寫個註解讓我們的name隻能支持Email格式


  • 空檢查

    • @Null 驗證對象是否為null
    • @NotNull 驗證對象是否不為null, 無法查檢長度為0的字符串
    • @NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大於0,隻對字符串,且會去掉前後空格.
    • @NotEmpty 檢查約束元素是否為NULL或者是EMPTY.
  • Booelan檢查

    • @AssertTrue 驗證 Boolean 對象是否為 true
    • @AssertFalse 驗證 Boolean 對象是否為 false
  • 長度檢查

    • @Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的范圍之內
    • @Length(min=, max=) Validates that the annotated string is between
      min and max included.
  • 日期檢查

    • @Past 驗證 Date 和 Calendar 對象是否在當前時間之前
    • @Future 驗證 Date 和 Calendar 對象是否在當前時間之後
    • @Pattern 驗證 String 對象是否符合正則表達式的規則(正則表達式)
  • 數值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單值為“”時無法轉換為int,但可以轉換為Stirng為””,Integer為null

    • @Min 驗證 Number 和 String 對象是否大等於指定的值
    • @Max 驗證 Number 和 String 對象是否小等於指定的值
    • @DecimalMax 被標註的值必須不大於約束中指定的最大值.
      這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.小數存在精度
    • @DecimalMin 被標註的值必須不小於約束中指定的最小值.
      這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.小數存在精度
    • @Digits 驗證 Number 和 String 的構成是否合法
    • @Digits(integer=,fraction=)
      驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。
    • @Range(min=, max=) Checks whether the annotated value lies between
      (inclusive) the specified minimum and maximum.
    • @Range(min=10000,max=50000,message=“range.bean.wage”) private
      BigDecimal wage;
    • @Valid 遞歸的對關聯對象進行校驗,
      如果關聯對象是個集合或者數組,那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)
    • @CreditCardNumber信用卡驗證
    • @Email 驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證。
    • @ScriptAssert(lang= ,script=, alias=)
    • @URL(protocol=,host=, port=,regexp=, flags=)

多環境切換

profile是Spring對不同環境提供不同配置功能的支持,可以通過激活不同的環境版本,實現快速切換環境

  • 方式一:多配置文件
    • 我們在主配置文件編寫的時候,文件名可以是 application-{profile}.properties/yml,用來指定多個環境版本;
    • 例如:
      • application-test.properties 代表測試環境配置
      • application-dev.properties代表開發環境配置
    • 但是SpringBoot並不會直接啟動這些配置文件,它默認使用application.properties主配置文件
    • 我們需要通過一個配置來選擇需要激活的環境:
      // 比如在配置文件中指定dev環境,我們可以通過設置不同的端口號進行測試;// 我們啟動SpringBoot,就可以看到已經切換到dev下的配置瞭spring.profiles.active=dev



      我們可以配置多個端口(測試端口,開發端口等等),在我們主配置文件中指定哪一個配置文件作為項目啟動的端口即可spring.profiles.active=配置文件名

  • 方式二:yaml的多文檔塊(默認為8081端口)
    • 和properties配置文件一樣,但是使用yml去實現不需要創建多個配置文件,更加方便瞭

      也是通過spring.profiles.active進行配置

    • 註意:如果yml和properties同時都配置瞭端口,並且沒有激活其他環境,默認會使用properties配置文件的!


配置文件加載位置

SpringBoot啟動會掃描以下位置的application.properties或者application.yml文件作為SpringBoot的默認配置文件

  • 優先級1:項目路徑下的config文件夾配置文件
  • 優先級2:項目路徑下配置文件
  • 優先級3:資源路徑下的config文件夾配置文件
  • 優先級4:資源路徑下配置文件

優先級由高到低,高優先級的配置會覆蓋低優先級的配置;

SpringBoot會從這四個位置全部加載主配置文件,互補配置;我們在最低級的配置文件中設置一個項目訪問路徑的配置來測試互補問題

// 配置項目的訪問路徑server.servlet.context-path=/huake

擴展:指定位置加載配置文件

  • 我們還可以通過spring.config.location來改變默認的配置文件位置
  • 項目打包好以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置
  • 這種情況,一般是後期運維做的多,相同配置,外部指定的配置文件優先級最高
java -jar spring-boot-config.jar --spring.config.location=F://application.properties

外部加載配置文件的方式十分多,我們選擇最常用的即可,在開發的資源文件中進行配置


自動配置原理再理解

  • 表示這是一個配置類

    @Configuration(proxyBeanMethods = false)
  • 自動配置屬性:HttpProperties

    @EnableConfigurationProperties(HttpProperties.class)
  • Spring的底層註解:根據不同的條件,來判斷當前配置或者類是否生效

    @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
  • 在配置文件中能配置的東西,都存在一個固有的規律:xxxPropertiesxxxAutoConfiguration

  • xxxAutoConfiguration有默認值(而這些默認值的改變是通過xxxProperties和配置文件的綁定),所以我們可以使用自定義的配置瞭

# Initializersorg.springframework.context.ApplicationContextInitializer=\org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener# Application Listenersorg.springframework.context.ApplicationListener=\org.springframework.boot.autoconfigure.BackgroundPreinitializer# Auto Configuration Import Listenersorg.springframework.boot.autoconfigure.AutoConfigurationImportListener=\org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener# Auto Configuration Import Filtersorg.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\org.springframework.boot.autoconfigure.condition.OnBeanCondition,\org.springframework.boot.autoconfigure.condition.OnClassCondition,\org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration# Failure analyzersorg.springframework.boot.diagnostics.FailureAnalyzer=\org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer# Template availability providersorg.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider

每一個這樣的xxxAutoConfiguration類都是容器中的一個組件,最後都加入到容器中;用他們來做自動配置

每一個自動配置類可以進行自動配置功能;

一句話總結:根據當前不同的條件判斷,決定這個配置類是否生效!

一但這個配置類生效;這個配置類就會給容器中添加各種組件;這些組件的屬性是從對應的properties類中獲取的,這些類裡面的每一個屬性又是和配置文件綁定的;

所有在配置文件中能配置的屬性都是在xxxProperties類中封裝著;配置文件能配置什麼就可以參照某個功能對應的這個屬性類

自動裝配的原理:

  • SpringBoot啟動會加載大量的自動配置類
  • 我們看我們需要的功能有沒有在SpringBoot默認寫好的自動配置類當中
  • 我們再來看這個自動配置類中到底配置瞭哪些組件;(隻要我們要用的組件存在在其中,我們就不需要再手動配置瞭)
  • 給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們隻需要在配置文件中指定這些屬性的值即可
  • xxxxAutoConfiguration:自動配置類(給容器中添加組件)
  • xxxxProperties:封裝配置文件中相關屬性

@Conditional

  • 瞭解完自動裝配的原理後,我們來關註一個細節問題,自動配置類必須在一定的條件下才能生效;@Conditional派生註解(Spring註解版原生的@Conditional作用)
  • 作用:必須是@Conditional指定的條件成立,才給容器中添加組件,配置裡面的所有內容才生效;


那麼多的自動配置類,必須在一定的條件下才能生效;也就是說,我們加載瞭這麼多的配置類,但不是所有的都生效瞭

我們可以通過啟用 debug=true屬性(默認為false);來讓控制臺打印自動配置報告,這樣我們就可以很方便的知道哪些自動配置類生效

// 開啟SpringBoot的調試類debug=true
  • Postive matches:(自動配置類啟用的:正匹配)
  • Negative matches:(沒有啟動,沒有匹配成功的自動配置類:負匹配)
  • Unconditional classes:(沒有條件的類)

輸出的日志我們可以在這裡看下:


SpringBoot Web開發

jar:webapp!

SpringBoot到底幫我們配置瞭什麼?我們能不能進行修改?能修改哪些東西?能不能擴展?

  • xxxxAutoConfiguration:向容器中自動配置組件
  • xxxxProperties:自動配置類,裝配配置文件中自定義的一些內容!

要解決的問題:

  • 導入靜態資源
  • 首頁
  • jsp,模板引擎 Thymeleaf
  • 裝配擴展SpringMVC
  • 增刪改查
  • 攔截器
  • 國際化

靜態資源

webjars

我們任意添加一個jsquery包



依此類推,優先級:resources > static(默認)> public

@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {if (!this.resourceProperties.isAddMappings()) {logger.debug("Default resource handling disabled");return;}Duration cachePeriod = this.resourceProperties.getCache().getPeriod();CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}String staticPathPattern = this.mvcProperties.getStaticPathPattern();if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}}
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };

總結:

  • 1、在SpringBoot,我們可以使用以下方式處理靜態資源
    • webjars(localhost:8080/webjars
    • public、static、/**、resources
  • 2、優先級:resources > static(默認)> public

模板引擎

前端交給我們的頁面,是HTML頁面,如果是我們以前開發,我們需要把他們轉成JSP頁面,JSP好處就是當我們查出一些數據轉發到JSP頁面以後,我們可以用jsp輕松實現數據的顯示,及交互等。jsp支持非常強大的功能,包括能寫Java代碼,但是呢,

  • 第一:我們現在的這種情況,SpringBoot這個項目首先是以jar的方式,不是war
  • 第二:我們用的還是嵌入式的Tomcat,所以呢,他現在默認是不支持jsp的

那不支持jsp,如果我們直接用純靜態頁面的方式,那給我們開發會帶來非常大的麻煩,那怎麼辦呢,SpringBoot推薦你可以來使用模板引擎——Thymeleaf。類似的模板引擎有jspfreemarker等等,那如何去使用?

第一步:引入Thymeleaf,對於SpringBoot來說,什麼事情不都是一個start的事情嘛,我們在去項目中引入一下。

  • 1、Thymeleaf官網:https://www.thymeleaf.org/
  • 2、Thymeleaf在Github的主頁:https://github.com/thymeleaf/thymeleaf
  • 3、Spring官方文檔:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/htmlsingle/#using-boot-starter,找到我們對應的版本
<!-- Thymeleaf 我們都是基於3.x開發的--><dependency>    <groupId>org.thymeleaf</groupId>    <artifactId>thymeleaf-spring5</artifactId></dependency><dependency>    <groupId>org.thymeleaf.extras</groupId>    <artifactId>thymeleaf-extras-java8time</artifactId></dependency>




結論:隻要需要使用thymeleaf,隻需要導入對應的依賴就可以瞭!我們將html放在我們的templates即可


Thymeleaf語法

order Feature Attributes
1 Fragment inclusion th:insert & th:replace
2 Fragment iteration th:each
3 Conditional evaluation th:if & th:unless & th:switch & th:case
4 Local variable definition th:object & th:with
5 General attribute modification th:attr & th:attrprepend & th:attrappend
6 Specific attribute modification th:value & th:href & th:src & …
7 Text(tag body modification) th:text & th:utext
8 Fragment specificaiton th:fragment
9 Fragment removal th:remove

演示一個小案例:(大致和JSP相似)

package com.blb.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import java.util.Arrays;@Controllerpublic class IndexController {    @RequestMapping("/test")    public String test(Model model){        model.addAttribute("msg", "hello SpringBoot");        model.addAttribute("users", Arrays.asList("huake", "wuli"));        return "test";    }}
<!DOCTYPE html><html lang="en" xmlns:th="http://www.thymeleaf.org"><head>    <meta charset="UTF-8">    <title>This is Thymeleaf</title></head><body>        <div th:text="${msg}"></div>    <div th:utext="${msg}"></div><hr><h3 th:each="user:${users}" th:text="${user}"></h3><h3 th:each="user:${users}">[[ ${user} ]]</h3></body></html>


SpringMVC自動配置

在進行測試前,我們還需要知道一個東西,就是SpringBoot對我們的SpringMVC還做瞭哪些配置,包括如何擴展,如何定制。

  • 途徑一:源碼分析
  • 途徑二:官方文檔

地址:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html

修改SpringBoot的默認配置

  • 方式一:
    • 這麼多的配置,原理都是一樣的,SpringBoot在自動配置很多組件的時候,先看容器中有沒有用戶自己配置的(如果用戶自己配置@bean),如果有就用用戶配置的,如果沒有就用自動配置的;如果有些組件可以存在多個,比如我們的視圖解析器,就將用戶配置的和自己默認的組合起來!

SpringBoot的JDBC

對於數據訪問層,無論是 SQL(關系型數據庫)還是NOSQL(非關系數據庫),SpringBoot底層都是采用SpringData的方式進行統一處理

SpringBoot底層都是采用SpringData的方式進行統一處理各種數據庫,SpringData也是Spring中與SpringBoot、SpringCloud等齊名的知名項目

在pom.xml配置中

// JDBC<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId></dependency>// Web<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>// MySQL<dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <scope>runtime</scope></dependency>

在創建項目後,我們可以選擇application.properties裡面配置JDBC屬性,但我們之前認識到瞭yaml語言,所以通過yaml來配置


如果你采用的是阿裡雲的途徑來創建項目,則會報如下錯;原因是因為通過阿裡雲創建的項目,在application.properties裡面就默認配置好瞭JDBC的屬性,所以隻需要註釋掉所有application.properties的配置信息即可

java.sql.SQLException: Access denied for user '***'@'localhost' (using password: YES)

在我們的測試代碼中

package com.zya;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import javax.sql.DataSource;import java.sql.Connection;import java.sql.SQLException;@SpringBootTestclass DemoApplicationTests {    @Autowired    DataSource dataSource;    @Test    void contextLoads() {        // 查看一下默認的數據源   : dbcp        System.out.println(dataSource.getClass());  // class com.zaxxer.hikari.HikariDataSource        // 獲取數據庫連接        try {            Connection connection = dataSource.getConnection();            System.out.println(connection);            // xxxx Template : SpringBoot已經配置好模板Bean, 拿來即用 CRUD            // 關閉            connection.close();        } catch (SQLException throwables) {            throwables.printStackTrace();        }    }}

DataSource dataSource的作用:

  • 通過DataSource可以獲取數據庫連接Connection
  • 通過DataSource創建JdbcTemplate操作數據庫
@AutowiredDataSource dataSource;

接著簡單寫一下我們JDBC的增刪改查(但SpringBoot框架真的很好,基本內容都應經幫忙配置好瞭)

package com.zya.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import java.util.List;import java.util.Map;@RestControllerpublic class JDBCController {    @Autowired    JdbcTemplate jdbcTemplate;    // 查詢數據庫的所有信息    // 沒有實體類 數據庫中的東西通過 Map 獲取    @GetMapping("/userList")    public List<Map<String, Object>> userList(){        String sql = "select * from Springuser";        List<Map<String, Object>> list_maps = jdbcTemplate.queryForList(sql);        return list_maps;    }// 增加用戶    @GetMapping("/addUser")    public String addUser(){        String sql = "insert into Springboot01.springuser(id, name, pwd, perms) values (2, 'huake', '123', 'world')";        jdbcTemplate.update(sql);        return "add-ok";    }// 更新用戶    @GetMapping("/updateUser/{id}")    public String updateUser(@PathVariable("id") int id){        String sql = "update Springboot01.springuser set name=?, pwd=? where id="+id;        // 封裝        Object[] objects = new Object[2];        objects[0] = "小明";        objects[1] = "zzzzz";        jdbcTemplate.update(sql, objects);        return "update-ok";    }// 刪除用戶    @GetMapping("/deleteUser/{id}")    public String deleteUser(@PathVariable("id") int id){        String sql = "delete from Springboot01.springuser where id=?";        jdbcTemplate.update(sql, id);        return "update-ok";    }}

@PathVariable()

  • 當使用@RequestMapping URI template 樣式映射時, 即 someUrl/{paramId},
    這時的paramId可通過 @Pathvariable註解綁定它傳過來的值到方法的參數上。

自定義數據源 DruidDataSource

Druid簡介:

  • Druid是阿裡巴巴開源平臺上一個數據庫連接池實現,結合瞭C3P0、DBCP、PROXOOL等DB池的優點,同時加入瞭日志監控
  • Druid可以很好的監控DB池連接和SQL的執行情況,天生就是針對監控而生的DB連接池
  • SpringBoot2.0以上默認使用Hikari數據源,可以說Hikari與Driud都是當前JavaWeb上最優秀的數據源,接下來重點介紹SpringBoot如何集成Druid數據源,如何實現數據庫監控

com.alibaba.druid.pool.DruidDataSource基本配置參數如下:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" />            <property name="url" value="${jdbc_url}" />       <property name="username" value="${jdbc_user}" />       <property name="password" value="${jdbc_password}" />              <property name="initialSize" value="1" />       <property name="minIdle" value="1" />        <property name="maxActive" value="20" />              <property name="maxWait" value="60000" />              <property name="timeBetweenEvictionRunsMillis" value="60000" />              <property name="minEvictableIdleTimeMillis" value="300000" />       <property name="validationQuery" value="SELECT 'x'" />       <property name="testWhileIdle" value="true" />       <property name="testOnBorrow" value="false" />       <property name="testOnReturn" value="false" />              <property name="poolPreparedStatements" value="true" />       <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />              <property name="filters" value="stat" />    </bean>

application.yml配置

spring:  datasource:    username: root    password: zya11230318    url: jdbc:mysql://localhost:3306/springboot01?characterEncoding=utf-8&serverTimezone=GMT%2B8    driver-class-name: com.mysql.cj.jdbc.Driver    type: com.alibaba.druid.pool.DruidDataSource    # SpringBoot 默認是不註入這些屬性值的,需要自己綁定    # druid 數據源專有配置    initialSize: 5    minIdle: 5    maxActive: 20    maxWait: 60000    timeBetweenEvictionRunsMillis: 60000    minEvictableIdleTimeMillis: 300000    validationQuery :SELECT 1 FROM DUAL    testWhileIdle: true    testOnBorrow: false    testOnReturn: false    poolPreparedStatements: true    # 配置監控統計攔截的filters, stat:監控統計、Log4j(日志記錄)、wall(防禦sql註入)    # 如果允許時報錯 java.lang.ClassNotFoundException: org.apache.log4j.Priority    # 則導入 log4j 依賴即可, Maven 地址: https://mvnrepository.com/artifact/log4j/log4j    filters: stat,wall,log4j    maxPoolPreparedStatementPerConnectionSize: 20    useGlobalDataSourceStat: true    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

後臺監控(阿裡巴巴)

package com.zya.config;import com.alibaba.druid.pool.DruidDataSource;import com.alibaba.druid.support.http.StatViewServlet;import com.alibaba.druid.support.http.WebStatFilter;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 javax.servlet.Filter;import javax.sql.DataSource;import java.util.HashMap;@Configurationpublic class DruidConfig {    @ConfigurationProperties(prefix = "spring.datasource")    @Bean    public DataSource druidDataSource(){        return new DruidDataSource();    }    // 後臺監控 : web.xml, ServletRegistrationBean    // 因為SpringBoot內置瞭servlet容器,所以沒有web.xml, 代替方法: ServletRegistrationBean    @Bean    public ServletRegistrationBean a(){        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");        // 後臺需要有人登錄, 賬號密碼配置        HashMap<String, String> initParameters = new HashMap<>();        // 增加配置        initParameters.put("loginUsername", "admin");   // 登錄key 是固定的 loginUsername和loginPassword        initParameters.put("loginPassword", "123456");        // 允許誰能訪問        initParameters.put("allow", "");    // 為空則誰都能訪問        // 禁止誰不能訪問 initParameters.put("huake", "192.168.11.123");    // 為空則誰都能訪問        bean.setInitParameters(initParameters);   // 設置初始化參數        return bean;    }    // filter    @Bean    public FilterRegistrationBean webStatFilter(){        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean();        bean.setFilter(new WebStatFilter());        // 可以過濾哪些請求呢?        HashMap<String, String> initParameters = new HashMap<>();        // 這些東西不進行統計        initParameters.put("exclusions", "*.js, *.css, /druid/*");        bean.setInitParameters(initParameters);        return bean;    }}

啟動我們的項目後,在路徑上輸入druid,就可以進入登錄頁面;輸入賬號密碼

進入到後臺頁面



當我們執行之前寫的sql語句時,這個後臺就會記錄下來,還有好多功能,就不在這一一演示瞭。


整合Mybatis框架

整體建包樣式:

mybatis-spring-boot-starter: 整合

<dependency>    <groupId>org.mybatis.spring.boot</groupId>    <artifactId>mybatis-spring-boot-starter</artifactId>    <version>2.1.1</version></dependency>

application.properties

  • mybatis.mapper-locations=classpath:mybatis/*.xml(一定要註意路徑不要找錯瞭!!!)
# 應用名稱spring.application.name=demo# 應用服務 WEB 訪問端口server.port=8080# 數據庫驅動:spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 數據源名稱spring.datasource.name=defaultDataSource# 數據庫連接地址spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8# 數據庫用戶名&密碼:spring.datasource.username=rootspring.datasource.password=zya11230318# 整合mybatismybatis.type-aliases-package=com.zya.pojomybatis.mapper-locations=classpath:mybatis/*.xml

創建一個User類

  • @Data 註解:主要作用是提高代碼的簡潔,使用這個註解可以省去代碼中大量的get()、 set()、 toString()等方法;
  • @NoArgsConstructor : 生成一個無參數的構造方法
  • @AllArgsContructor: 會生成一個包含所有變量的構造方法,默認生成的方法是 public 的
package com.zya.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublic class User {    private int id;    private String name;    private String pwd;}

UserMapper接口

  • @Mapper註解是由Mybatis框架中定義的一個描述數據層接口的註解,註解往往起到的都是一個描述性作用,用於告訴spring框架此接口的實現類由Mybatis負責創建,並將其實現類對象存儲到spring容器中。
    首先我們需要引入jar包(依賴),分別是JDBC、MYSQL、MYBATI

@Mapper和@Repository的區別:

  • 使用@mapper後,不需要在spring配置中設置掃描地址,通過mapper.xml裡面的namespace屬性對應相關的mapper類,spring將動態的生成Bean後註入到ServiceImpl中。
  • @repository則需要在Spring中配置掃描包地址,然後生成dao層的bean,之後被註入到ServiceImpl中
package com.zya.mapper;import com.zya.pojo.User;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;import java.util.List;// 這個註解表示瞭這是一個 mybatis的mapper類@Mapper@Repositorypublic interface UserMapper {    List<User> queryUserList();    User queryUserById(int id);    int addUser(User user);    int updateUser(User user);    int deleteUser(int id);}

UserController類

@RestController:

  • 相當於@Controller+@ResponseBody兩個註解的結合,返回json數據不需要在方法前面加@ResponseBody註解瞭,但使用@RestController這個註解,就不能返回jsp,html頁面,視圖解析器無法解析jsp,html頁面
package com.zya.controller;import com.zya.mapper.UserMapper;import com.zya.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestControllerpublic class UserController {    @Autowired    private UserMapper userMapper;    // 查詢所有人信息    @GetMapping("/queryUserList")    public List<User> queryUserList(){        List<User> userList = userMapper.queryUserList();        for (User user:userList) {            System.out.println(user);        }        return userList;    }    // 添加一個用戶    @GetMapping("/addUser")    public String addUser(){        userMapper.addUser(new User(4, "hello", "123"));        return "ok";    }    // 修改一個用戶信息    @GetMapping("/updateUser")    public String updateUser(){        userMapper.updateUser(new User(4, "world", "1233"));        return "ok";    }    // 刪除一個用戶    @GetMapping("/deleteUser")    public String deleteUser(){        userMapper.deleteUser(4);        return "ok";    }}

mybatis下的UserMapper.xml配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.zya.mapper.UserMapper">    <select id="queryUserList" resultType="User">        select * from userone    </select>    <select id="queryUserById" resultType="User">        select * from userone where id=#{id}    </select>    <insert id="addUser" parameterType="User">        insert into userone (id, name, pwd) values (#{id}, #{name}, #{pwd})    </insert>    <update id="updateUser" parameterType="User">        update userone set name=#{name}, pwd=#{pwd} where id=#{id}    </update>    <delete id="deleteUser" parameterType="int">        delete from userone where id=#{id}    </delete></mapper>

SpringSecurity(安全)

在web開發中,安全第一位!類似:過濾器、攔截器等等

功能性需求:否

做網站時,安全應該在設計之初考慮

  • 漏洞,隱私泄露
  • 架構一旦確定

shiro、SpringSecurity:很像,除瞭類不一樣,名字不一樣;