最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

教程揭秘 | 動力節(jié)點(diǎn)內(nèi)部Java零基礎(chǔ)教學(xué)文檔第十四篇:SpringBoot

2023-11-21 09:38 作者:動力節(jié)點(diǎn)  | 我要投稿

接上期后續(xù)

本期分享第十四章節(jié)

Spring Boot

已經(jīng)分享一大半了,你們都跟上了嗎?

每天都在學(xué)習(xí)嘛?

有什么不會的嘛?

今日教學(xué)文檔分享來了?

今日新篇章

【SpringBoot】

SSM

Springboot

分布式微服務(wù)

1.?Spring的發(fā)展

回顧:Spring是一個開源框架,2003年興起的一個輕量級的Java 開發(fā)框架,作者:Rod JohnsonSpring是為了解決企業(yè)級應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的,簡化開發(fā)。

1.1?Spring1.x時代

在Spring1.x時代,都是通過xml文件配置bean,隨著項(xiàng)目的不斷擴(kuò)大,需要將xml配置分放到不同的配置文件中,需要頻繁的在java類和xml配置文件中切換。

1.2?Spring2.x時代

隨著JDK 1.5帶來的注解支持,Spring2.x可以使用注解對Bean進(jìn)行申明和注入,大大的減少了xml配置文件,同時也大大簡化了項(xiàng)目的開發(fā)。

那么,問題來了,究竟是應(yīng)該使用xml還是注解呢?

1.3?注解還是XML

在spring早期版本中,由于當(dāng)時的JDK并不支持注解,因此只能使用XML的配置,很快,隨著JDK升級到JDK5之后,它加入了注解的新特性,這樣注解就被廣泛地使用起來, 于是spring內(nèi)部也分為兩派,一派是使用XML的,一派是使用注解的,為了簡化開發(fā),在spring2.X之后的版本也引入了注解,不過是少量的注解,如@Component @Service等,但是功能還是不強(qiáng)大,因此對于srping的開發(fā),大部分情況下還是使用XML為主,隨著注解的增加,尤其是Servlet3.0


@WebServlet

@WebFilter

@WebListener

之后,WEB容器可以脫離web.xml的部署,使用得WEB容器完全可以基于注解開發(fā),對于spring3和spring4的版本注解功能越來越強(qiáng)大。對于XML的依賴起來越少,到了4.0完全可以脫離XML, 所以在spring中使用注解開發(fā)占據(jù)了主流地位,近年來。微服務(wù)的流行,越來越多的企業(yè)要求快速開發(fā),所以spring Boot更加興旺了。

應(yīng)用的基本配置用xml,比如:數(shù)據(jù)源、資源文件等;

業(yè)務(wù)開發(fā)用注解,比如:Service中注入bean等;

1.4?Spring3.x到Spring4.x

從Spring3.x開始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,現(xiàn)在我們就處于這個時代,并且Spring4.x和Springboot都推薦使用java配置的方式。

2.?Spring Boot和微服務(wù)的介紹

2.1?SpringBoot的簡介

Spring Boot 是由 Pivotal 團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新 Spring 應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot 致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。

https://spring.io/projects/spring-boot

https://docs.spring.io/spring-boot/docs/current/reference/html/

2.2?Spring?Boot的優(yōu)點(diǎn)

約定大于配置

創(chuàng)建獨(dú)立的spring應(yīng)用程序。

嵌入的tomcat ?jetty 或者undertow 不用部署WAR文件。

允許通過Maven來根據(jù)需要獲取starter

盡可能的使用自動配置spring

提供生產(chǎn)就緒功能,如指標(biāo),健康檢查和外部配置properties ?yaml yml

完全沒有代碼生成,對XML沒有要求配置[不用]

2.2.1?特性理解

為基于 Spring 的開發(fā)提供更快的入門體驗(yàn)

開箱即用,沒有代碼生成,也無需 XML 配置。同時也可以修改默認(rèn)值來滿足特定的需求。

提供了一些大型項(xiàng)目中常見的非功能特性,如嵌入式服務(wù)器、安全、指標(biāo),健康檢測、外部配置等。

Spring Boot 并不是對 Spring 功能上的增強(qiáng),而是提供了一種快速使用 Spring 的方式。

2.2.2?傳統(tǒng)開發(fā)模式

所有的功能打包在一個 WAR包里,基本沒有外部依賴(除了容器),部署在一個JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI等所有邏輯。

2.2.2.1?優(yōu)點(diǎn):

l?開發(fā)簡單,集中式管理

l?基本不會重復(fù)開發(fā)

l?功能都在本地,沒有分布式的管理和調(diào)用消耗

2.2.2.2?缺點(diǎn):

l?效率低:開發(fā)都在同一個項(xiàng)目改代碼,相互等待,沖突不斷

l?維護(hù)難:代碼功功能耦合在一起,新人不知道何從下手

l?不靈活:構(gòu)建時間長,任何小修改都要重構(gòu)整個項(xiàng)目,耗時

l?穩(wěn)定性差:一個微小的問題,都可能導(dǎo)致整個應(yīng)用掛掉

l?擴(kuò)展性不夠:無法滿足高并發(fā)下的業(yè)務(wù)需求

l?對服務(wù)器的性能要求要統(tǒng)一,要高

2.2.3?微服務(wù)開發(fā)

微服務(wù):架構(gòu)風(fēng)格(服務(wù)微化)

微服務(wù)是指開發(fā)一個單個小型的但有業(yè)務(wù)功能的服務(wù),每個服務(wù)都有自己的處理和輕量通信機(jī)制,可以部署在單個或多個服務(wù)器上,微服務(wù)也指一種松耦合的,有一定有界上下文的面向服務(wù)的架構(gòu) ? ? ??

目的:有效的拆分應(yīng)用,實(shí)現(xiàn)敏捷開發(fā)和部署

2.2.3.1?優(yōu)點(diǎn)

l?每個微服務(wù)都很小,這樣能聚焦一個指定的業(yè)務(wù)功能或業(yè)務(wù)需求

l?微服務(wù)能夠被小團(tuán)隊(duì)開發(fā),這個小團(tuán)隊(duì)2-5人就可以完成了

l?微服務(wù)是松耦合的,是有功能,有意義的服務(wù),開發(fā)階段或部署階段都是獨(dú)立的

l?微服務(wù)可以使用不同的語言開發(fā)

l?微服務(wù)能部署在中低端配置的服務(wù)器上

l?很容易和第三方集成

l?每個服務(wù)都有自己的存儲能力,單獨(dú)的庫,也可以有統(tǒng)一的庫

2.2.3.2?缺點(diǎn) ??

l?微服務(wù)會帶來過多的操作

l?可能有雙倍的努力?

l?分布式系統(tǒng)可能復(fù)雜難管理

l?分布跟蹤部署難

l?當(dāng)服務(wù)數(shù)量增加時,管理復(fù)雜度增加

3.?Spring Boot 入門程序

3.1?環(huán)境準(zhǔn)備

①JDK1.8

②Maven3.6+

③IDEA2020.1

④SpringBoot2.x

⑤Spring5.x

3.2?新建項(xiàng)目

3.3?在項(xiàng)目里面創(chuàng)建模塊

這里我們選擇創(chuàng)建Module來完成第一個Spring Boot項(xiàng)目

?

3.4?項(xiàng)目目錄說明

?


3.5?Pom.xml文件分析

3.6?創(chuàng)建IndexController(在啟動類同級或者子包下面)

?

?

3.7?啟動

?


3.8?測試訪問

http://localhost:8080/hello?

3.9?打jar包啟動測試

?


?

在target目錄下找到j(luò)ar包并且在文件夾中打開

?


測試訪問

http://localhost:8080/hello?

3.10?彩蛋

啟動時查看控制臺的輸出會發(fā)現(xiàn)有一個banner圖案,這個banner圖案是可以自定義的

?


3.10.1?修改為自己的banner

在src/main/resources目錄下面創(chuàng)建一個banner.txt文件,并且輸入想要的內(nèi)容即可

這里提供一個字體生產(chǎn)網(wǎng)站 https://www.bootschool.net/ascii?可以隨意創(chuàng)建

?


3.10.2?啟動查看

?


4.?常用注解【spring的java配置】

4.1?回顧spring和java的注解

4.1.1?類上的注解

@Controller

控制器

@RestController=@Controller+@ResponseBody

返回json的控制器

@Service

標(biāo)記服務(wù)接口

@Respority

標(biāo)記倉庫接口

@Component

標(biāo)記組件

@RequestMapping

請求映射 (也可在方法上)

作用在類上的常用注解

4.1.2?方法上的注解

@RequestMapping

請求映射

@GetMapping

GET請求

@PostMapping

POST請求

@DeleteMapping

DELETE請求

@PutMapping

PUT請求

@PatchMapping

PATCH請求

@ResponseBody

返回JSON對象

?

4.1.3?參數(shù)上的注解

@RequestBody

入?yún)⑹荍SON對象

@PathVariable

將路徑上面的參數(shù)映射到入?yún)⒗锩?/strong>

@RequestParam

將請求參數(shù)綁定到你控制器的方法參數(shù)上

4.1.4?屬性上的注解

@Autowried

自動注入(首選按照類型) ?byType byName

@Resource

自動注入(首選按照名字)byName byType

4.2?相關(guān)注解說明

4.2.1?@Configuration

作用于類上,相當(dāng)于一個xml配置文件;

|--application-dao.xml

4.2.2?@Bean

作用于方法上,相當(dāng)于xml配置中的<bean>

4.2.2.1?創(chuàng)建實(shí)體類測試注解用法

4.2.2.2?創(chuàng)建配置類

?

4.2.3?@Qualifier注解

qualifier的意思是合格者,通過這個標(biāo)示,表明了哪個實(shí)現(xiàn)類才是我們所需要的,我們修改調(diào)用代碼,添加@Qualifier注解,需要注意的是@Qualifier的參數(shù)名稱必須為我們之前定義@Bean注解的名稱之一

4.2.4?@Primary 主候選的

當(dāng)IOC容器里面有多個同類型的對象時,就會發(fā)生沖突,標(biāo)注了該注解的就作為主候選對象

4.2.5?@Import注解

在創(chuàng)建配置文件之后可以引入其它的配置文件

|--<import resource="classpath:application-dao.xml"/>

4.2.6?@ComponentScan("com.bjpowernode")配置掃描

|--<context:component-scan base-package="com.bjpowernode.*.mapper"/>

5.?Spring Boot熱部署

5.1?什么是熱部署

spring為開發(fā)者提供了一個名為spring-boot-devtools的模塊來使springboot應(yīng)用支持熱部署,提高開發(fā)的效率,修改代碼后無需重啟應(yīng)用

5.2?添加依賴

<!--添加熱部署的依賴-->
<dependency>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-devtools</artifactId>
????<!--運(yùn)行時生效-->
????<scope>runtime</scope>
????<!--依賴是否會傳遞,為true則不會傳遞-->
????<optional>true</optional>
</dependency>

5.3?配置idea的啟動面板

如果不配置面板,那么可直接使用ctrl+F9去刷新,配置 以后,當(dāng)我們修改代碼,光標(biāo)失去idea的焦點(diǎn)以后,就出觸發(fā)自動部署

?


?

6.?手動創(chuàng)建springboot項(xiàng)目

6.1?創(chuàng)建maven項(xiàng)目

?


6.2?修改pom.xml

?

?

?

6.3?創(chuàng)建啟動類

?


?

6.4?創(chuàng)建測試類

?


?

6.5?創(chuàng)建static,templates

6.6?創(chuàng)建application.properties

7.?Spring Boot的自動配置原理以及啟動分析(難點(diǎn))

1,默認(rèn)的包掃描

啟動類所在的包及其子包

2,依賴的分析

7.1?pom的依賴分析

?

這里才是真正管理SpringBoot應(yīng)用里面所有依賴版本的地方,SpringBoot的版本控制中心;以后我們導(dǎo)入依賴默認(rèn)是不需要寫版本;但是如果導(dǎo)入的包沒有在依賴中管理著就需要手動配置版本了

7.2?啟動器 spring-boot-starter

<dependency>
??<groupId>org.springframework.boot</groupId>
??<artifactId>spring-boot-starter</artifactId>
??<version>2.5.3</version>
??<scope>compile</scope>
</dependency>

springboot-boot-starter-xxx:就是spring-boot的場景啟動器

<!--web的依賴整合了Mvc-->
<!-- 引入了spring-boot-starter-web以后,springboot就幫我們導(dǎo)入了web模塊運(yùn)行的所有組件 -->
<dependency>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-starter-web</artifactId>
</dependency>

?

SpringBoot將所有的功能場景都抽取出來,做成一個個的starter (啟動器),只需要在項(xiàng)目中引入這些starter即可,所有相關(guān)的依賴都會導(dǎo)入進(jìn)來 , 我們要用什么功能就導(dǎo)入什么樣的場景啟動器即可 ,也可以自己自定義 starter;

7.3?原理分析

7.3.1?注解功能劃分

?


7.3.2?如何自動掃描(默認(rèn)掃描啟動類所在的包以下面的及子包)

@Import(AutoConfigurationPackages.Registrar.class)

在Registrar里面,找到register()方法

?


7.3.3?如何加載自動配置類

找到@Import(AutoConfigurationImportSelector.class) ?

7.3.3.1?在這個類里面的getAutoConfigurationEntry()方法

?


?

7.3.3.2?進(jìn)入getCandidateConfigurations()方法查看究竟

?


這個方法spring的加載工廠去篩選所有引入(link)EnableAutoConfiguration的配置類

EnableAutoConfiguration是Key 返回的List<String>是value

7.3.3.3?接著進(jìn)入loadFactoryNames()方法

?

?

7.3.3.4?查看MATE-INF/spring.factories文件

?

最終我們從候選方法中獲取到了需要自動配置的全限定類名的集合,我們再回到一開始的加載候選的方法

7.3.3.5?最后回到getAutoConfigurationEntry()方法里面往下執(zhí)行

?


7.3.3.6?剔除掉不需要的自動配置類(pom.xml中沒有加入依賴的)

?


至此自動加載配置類的初探就結(jié)束了

7.4?選講如何加載前端控制器(DispatcherServlet)

7.4.1?在ssm里面,我們需要手動去創(chuàng)建DispatcherServlet對象,然后注入到Servlet容器中

??


7.4.2?再SpringBoot中只要我們加了Web的starter,就默認(rèn)做好了

7.4.2.1?查看DispatcherServletAutoConfiguration這個自動配置類

?


?

?

現(xiàn)在深刻理解了SpringBoot的 約定大于配置?這一句話了吧

8.?Spring Boot的run方法到底執(zhí)行了什么

?


?

9.?Spring Boot給我們提供了哪些自動配置類呢?

?

https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters?

?


如果你需要使用,可以直接添加對應(yīng)的starter的依賴,那么只需要自定一些參數(shù)即可,因?yàn)橐呀?jīng)有默認(rèn)配置了,但是如果你需要的組件沒有starter,那么久需要自己寫配置類了

?

10.?Spring Boot的配置文件語法【重中之重】

10.1?首先引入依賴

<!-- 配置文件拓展依賴-->
<dependency>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-configuration-processor</artifactId>
????<optional>true</optional>
</dependency>

10.2?創(chuàng)建Hero 類

@Data ???// lombok的注解,生成get和set方法
@Component ?// 標(biāo)記為spring的一個組件
@ConfigurationProperties(prefix = "hero") ??// 使用hero前綴去ioc容器里面讀取配置文件
public class Hero {

????private Integer id;
????private Integer age;
????private String name;
????private Date birth;
????private String[] hobby;
????private List<String> list;
????private Set<String> set;
????private Map<String, String> map;

}

10.3?properties方式

hero.id=2
hero.name=CXS
hero.age=18
hero.birth=2012/12/31
hero.hobby=LOL,DNF,CF
hero.list=C#,Python,PS
hero.set=football,basketball,swim
hero.map.k1=v1
hero.map.k2=v2

10.4?Yml方式

hero:
????id: 2
????age: 18
????name: 超人
????birth: 2012/12/31
????hobby:
????????- LOL
????????- DNF
????????- CF
????list:
????????- JAVA
????????- JS
????????- C++
????set:
????????- 足球
????????- 籃球
????????- 排球
????map:
????????k1: v1
????????k2: v2

10.5?測試

這里我們得知當(dāng)properties配置和yml配置都存在是 proeprties的優(yōu)先級更高

?


10.6?配置文件占位符

?


10.7?配置文件中讀取IOC容器里的值

?


10.8?兩種配置文件的用法說明

1,如果properties里面配置了就不會去yml里面去取值,如果沒有配置就會去yml里面取

2,兩種配置文件是互補(bǔ)的存在

10.9?練習(xí)作業(yè)

在Hero中添加一個屬性

private List<User> user;

如何通過配置文件注入

?

11.?@Value讀取配置文件

11.1?創(chuàng)建Hero2類

@Data ???// lombok的注解,生成getset方法
@Component ?// 標(biāo)記為spring的一個組件
public class Hero2 {

????@Value("${hero.id}")
????private Integer id;
????@Value("${hero.age}")
????private Integer age;
????@Value("${hero.name}")
????private String name;
????@Value("${hero.birth}")
????private Date birth;
// ???????@Value("${hero.hobby}")
????private String[] hobby;
// ???????@Value("${hero.list}")
????private List<String> list;
????// ???@Value("${hero.set}")
????private Set<String> set;
????// ???@Value("${hero.map}")
????private Map<String, String> map;
}

11.2?Yml文件

hero:
????id: 2
????age: 18
????name: 小白
????birth: 2012/12/31
????hobby:
????????- LOL
????????- DNF
????????- CF
????list:
????????- JAVA
????????- JS
????????- C++
????set:
????????- 足球
????????- 籃球
????????- 排球
????map:
????????k1: v1
????????k2: v2

11.3?總結(jié)說明

1,@Value只能注入普通的屬性[也就是基本數(shù)據(jù)類型和String,Date] 其它的復(fù)雜類型是不能取到值的[如果yaml配置是array:LOL,DNF]這樣的配置是可以取

2,如果屬性是使用駝峰命名法則不能使用屬性名注入,要使用@Value("${hero.class-name}")來取值

不能使用@Value("${hero.className}")來取值?

11.4?@Value和@ConfigurationProperties取值比較

?


12.?注解驗(yàn)證

12.1?引入依賴

Springboot2.3.x以后,需要單獨(dú)引入依賴,之前在web-starter里面包含

<!--引入注解驗(yàn)證的依賴-->
<dependency>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

12.2?修改Hero類

?


12.3?修改application.yml文件

?


12.4?測試

?


12.5?常用的驗(yàn)證注解

@NotNull ?--不能為null,但可以空著不寫 (name:)

@NotEmpty ?--不能為空,也不能為null,但可以是空格 “ ?”

@NotBlank --不能為空,也不能為null,也不能為空格

@Min ????最大值

@Max ???最小值

@Size(min = 1, max = 6) ??長度限制

@Range(min = 1,max = 2)???范圍限制

@Pattern(regexp"[0,1]{1}")???正則限制

?


13.?@PropertySource和@ImportResource的使用

13.1?為什么要用@PropertiesSource

上面的注入,所有的配置都是寫在appliaction.properties或application.yml文件里,那么如果不想寫在這里面怎么處理呢,使用@PropertySource可以解決

13.2?注入優(yōu)先級的問題

所在的配置都是優(yōu)先注入appliaction.properties或application.yml里面的數(shù)據(jù)

如果要不一樣,必須修改配置文件引入的前綴

13.3?創(chuàng)建Hero3類

@Data
@Component ?// 標(biāo)記為spring的一個組件
@PropertySource(value = {"classpath:hero.properties"}) ?// properties配置文件的指定
@ConfigurationProperties(prefix = "hero") ??// 使用hero前綴去ioc容器里面讀取配置文件
public class Hero3 {

????private Integer id;
????private String name;
????private Integer age;
????private Date birth;
????private String[] hobby;
????private List<String> list;
????private Set<String> set;
????private Map<String, String> map;
????private String className;
}

13.4?創(chuàng)建Hero.properties配置文件

hero.name="測試自己的配置文件"
hero.className="班級名稱"

13.5?測試

?


?

13.6?為什么要用@ImportResource

從上面所有的配置中可以看出我們沒有使用以前的spring的xml的配置方法,如果還是要使用spring里面的xml的配置方式怎么辦理,使用@ImportResource

13.7?創(chuàng)建Hero4類

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hero4 {
????private Integer id;
????private String name;
}

13.8?創(chuàng)建beans.xml

13.9?啟動類添加@ImportResource注解

?


13.10?測試

?


14.?Profile配置文件詳解

14.1?為什么要使用profiles

在開發(fā)中,一般有兩種環(huán)境

? ? ? ? 1,生產(chǎn)環(huán)境 [項(xiàng)目上線,客戶在使用中,就是生產(chǎn)環(huán)境]

? ? ? ? 2,開發(fā)環(huán)境 [就是開發(fā)環(huán)境,自己開發(fā)測試的環(huán)境]

有時候開發(fā)環(huán)境和生產(chǎn)環(huán)境的配置方法是不一樣的,那么如何快速的切換呢,這里就要使用profiles文件

14.2?創(chuàng)建application-dev.yml

14.3?創(chuàng)建application-pro.yml

14.4?修改application.yml

在application.yml的主配置文件中,激活哪個配置文件,就會使用該配置文件進(jìn)行運(yùn)行

?


14.5?啟動測試

?


14.6?打jar包部署運(yùn)行測試

打jar包運(yùn)行不會去看3.9章節(jié)

java -jar 01-spring-boot-hello-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro

?


15.?配置文件加載優(yōu)先級和外部配置文件

15.1?項(xiàng)目內(nèi)部配置文件

spring boot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認(rèn)配置文件

其中同一目標(biāo)下的properties文件的優(yōu)先級大于yml文件

15.1.1?配置文件可以放的位置和優(yōu)先級

classpath:/ ??????????--優(yōu)先級4

classpath:/config/ ???--優(yōu)先級3

file:./ ????????????????--優(yōu)先級2

file:./config/ ?????????--優(yōu)先級1

?


15.1.2?查看ConfigDataEnvironment

?


15.1.3?測試注意

在測試的時候,需要修改pom的編譯路徑,確保把所有的配置文件都編譯以后再測試

15.2?外部的配置文件

在D盤放一個application.yml文件 端口指定為8009

打包后使用命令行運(yùn)行并且指定

java -jar 02-spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.yml

?


15.2.1?使用命令行參數(shù)

也可以使用命令行參數(shù)指定(文檔一行寫不下,你們寫的時候不要回車?。?/span>

java -jar 02-spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8888 --server.servlet.context-path=/bjpowernode

?

16.?自動配置原理以及 @Conditional派生注解

16.1?配置文件到底怎么寫什么?怎么寫?

https://docs.spring.io/spring-boot/docs/2.5.3/reference/htmlsingle/#application-properties?

16.2?自動配置

7.3.3以后,我們就了解到了Spring Boot在啟動的時候:

l?去掃描加載了所有引入依賴的jar包下面的MATE-INF/spring.factories文件,

l?然后通過EnableAutoConfiguration為key,下面所有自動配置類的全限定類名作為value,(List<String>)

l?經(jīng)過篩選排除掉不符合要求的(pom中沒有添加依賴的配置類)

l?最后把(List<String>:符合條件的自配配置類的全限定類名)添加到IOC容器去管理,從而實(shí)現(xiàn)了自動配置原理

16.3?以HttpEncodingAutoConfiguration為例來理解自動裝配

根據(jù)當(dāng)前不同的條件判斷,決定這個配置類是否生效?

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

//表示這是一個配置類
@Configuration(proxyBeanMethods = false)
//開啟自動配置屬性,指定ServerProperties配置文件
@EnableConfigurationProperties(ServerProperties.class)
//spring的底層注解,根據(jù)條件判斷當(dāng)前類是否生效
//判斷當(dāng)前項(xiàng)目環(huán)境是否是一個web環(huán)境
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
//判斷當(dāng)前環(huán)境是否有CharacterEncodingFilter類
@ConditionalOnClass(CharacterEncodingFilter.class)
//判斷我們自己配置的yml文件里面是否有server.servlet.encoding.enabled屬性,如果沒有就自動生效
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

????//這個屬性和下面的有參構(gòu)造器綁定在了一起,配置文件映射成功
????private final Encoding properties;

????public HttpEncodingAutoConfiguration(ServerProperties properties) {
????????this.properties = properties.getServlet().getEncoding();
????}

????@Bean //創(chuàng)建一個CharacterEncodingFilter對象
????@ConditionalOnMissingBean //前提條件是容器里面沒有這個對象
????public CharacterEncodingFilter characterEncodingFilter() {
????????CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
????????filter.setEncoding(this.properties.getCharset().name());
????????filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
????????filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
????????return filter;
????}
}

16.4?總結(jié)

- SpringBoot啟動會加載大量的自動配置類

- 看我們需要的功能有沒有SpringBoot默認(rèn)寫好的自動配置類;

- 我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)

- 給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可

以在配置文件中指定這些屬性的值;

????- xxxxAutoConfigurartion:自動配置類;給容器中添加組件

????- xxxxProperties:封裝配置文件中的默認(rèn)配置

16.5?@Conditional派生注解

作用:必須是@Conditional指定的條件成立,才給容器中添加組件,配置類里面的所有內(nèi)容才生效;(條件之間是并且的關(guān)系)

?


16.6?如何查看自動配置類生效

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

?


?

17.?整合logback

17.1?概述

在搭建新的系統(tǒng)時候必不可少的是需要日志的,日志的作用就不用多說了吧,可以用來調(diào)試程序,記錄程序運(yùn)行的狀態(tài),最重要的是可以用來排查線上的問題。

那我們該如何在項(xiàng)目中使用日志呢?

SpringBoot內(nèi)部集成了LogBack日志依賴,SpringBoot默認(rèn)使用LogBack記錄日志信息,默認(rèn)根據(jù)base.xml配置內(nèi)容來輸出到控制臺和文件之中,不過這些默認(rèn)的配置不能達(dá)到企業(yè)級項(xiàng)目的要求

17.2?創(chuàng)建模塊

?


17.3?創(chuàng)建logback-spring.xml

17.4?修改啟動類測試

?


17.5?查看本地日志

?


18.?AOP開發(fā)

18.1?概述

aop是spring的兩大功能模塊之一,功能非常強(qiáng)大,為解耦提供了非常優(yōu)秀的解決方案。SpringBoot集成aop是非常方便的,下面使用aop來攔截業(yè)務(wù)組件的方法

Aop的作用:在不修改源代碼的情況下,對類里面的方法進(jìn)行增強(qiáng)

(前置,后置,環(huán)繞,異常)

18.2?使用方法

18.3?創(chuàng)建項(xiàng)目并添加maven依賴

<dependency>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

18.4?創(chuàng)建Man測試類

/**
?* 將此類加入IOC管理
?* AOP作用的類一定要加入IOC容器中
?*/
@Component
public class Man {


????/**
?????* 吃飯的方法
?????*
?????* @param foodsName
?????* @return
?????*/
????public String eat(String foodsName) {
????????System.out.println("" + foodsName);
????????return foodsName + "很好吃";
????}
}

18.5?創(chuàng)建切面

18.6?測試

?


18.7?代理方式的切換

從springBoot2.x以后,切換代理方式需要在配置文件中配置,使用注解切換的方式失效了

?

修改application.yml文件的切換方式代理方式

spring:
????aop:
????????proxy-target-class: true # false表示使用JDK代理??true表示使用CGLIB代理,SpringBoot2.x以后默認(rèn)使用CGLIB代理

19.?WEB靜態(tài)資源訪問規(guī)則

19.1?springboot訪問靜態(tài)資源的幾種方式

查看WebMvcAutoConfiguration里面的靜態(tài)類WebMvcAutoConfigurationAdapter

關(guān)于資源管的方法addResourceHandlers

?

點(diǎn)進(jìn)去看一下靜態(tài)資源可以存放的位置

?

如果這四個目錄下面都有相同的文件,那么訪問的優(yōu)先級為:

META-INF/resources>resources>static>public

19.2?自定義靜態(tài)資源訪問方式

19.2.1?自定義方式1配置文件方式y(tǒng)ml

spring:
????web:
????????resources:
????????????static-locations: classpath:/mystatic/ ?# 靜態(tài)資源存放的目錄
????mvc:
????????static-path-pattern: /static/** # 訪問mvc的路徑映射

?


?

19.2.2?Java類方式

/**
?* 自己寫配置類去實(shí)現(xiàn)WebMvc的配置,并且重寫
?*/
@Configuration
public class MyWebMvcResourceHandler implements WebMvcConfigurer {

????/**
?????* 重寫靜態(tài)資源配置的方法
?????*
?????* @param registry
?????*/
????@Override
????public void addResourceHandlers(ResourceHandlerRegistry registry) {
????????registry.addResourceHandler("/static/**")
????????????????.addResourceLocations("classpath:/mystatic/");
????}
}

19.3?webjars的訪問規(guī)則

19.3.1?什么是webjars

WebJars是打包到JAR(Java Archive)文件中的客戶端Web庫(例如jQuery和Bootstrap)。

在基于JVM的Web應(yīng)用程序中顯式輕松地管理客戶端依賴項(xiàng)

使用基于JVM的構(gòu)建工具(例如Maven,Gradle,sbt,...)來下載客戶端依賴項(xiàng)

了解您正在使用的客戶端依賴項(xiàng)

傳遞依賴關(guān)系會自動解析,并可選擇通過RequireJS加載

官網(wǎng):https://www.webjars.org/?

19.3.2??引入依賴

<dependency>
????<groupId>org.webjars</groupId>
????<artifactId>jquery</artifactId>
????<version>3.6.0</version>
</dependency>

19.3.3?啟動訪問

http://localhost:8080/webjars/jquery/3.6.0/jquery.js?

?


20.?Thymeleaf模板的使用

20.1?Thymeleaf概述

簡單說, Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP 。相較與其他的模板引擎,它有如下三個極吸引人的特點(diǎn):

1、Thymeleaf 在有網(wǎng)絡(luò)和無網(wǎng)絡(luò)的環(huán)境下皆可運(yùn)行,即它可以讓美工在瀏覽器查看頁面的靜態(tài)效果,也可以讓程序員在服務(wù)器查看帶數(shù)據(jù)的動態(tài)頁面效果。這是由于它支持 html 原型,然后在 html 標(biāo)簽里增加額外的屬性來達(dá)到模板+數(shù)據(jù)的展示方式。瀏覽器解釋 html 時會忽略未定義的標(biāo)簽屬性,所以 thymeleaf 的模板可以靜態(tài)地運(yùn)行;當(dāng)有數(shù)據(jù)返回到頁面時,Thymeleaf 標(biāo)簽會動態(tài)地替換掉靜態(tài)內(nèi)容,使頁面動態(tài)顯示。

2、Thymeleaf 開箱即用的特性。它提供標(biāo)準(zhǔn)和spring標(biāo)準(zhǔn)兩種方言,可以直接套用模板實(shí)現(xiàn)JSTL、 OGNL表達(dá)式效果,避免每天套模板、該jstl、改標(biāo)簽的困擾。同時開發(fā)人員也可以擴(kuò)展和創(chuàng)建自定義的方言。

3、Thymeleaf 提供spring標(biāo)準(zhǔn)方言和一個與 SpringMVC 完美集成的可選模塊,可以快速的實(shí)現(xiàn)表單綁定、屬性編輯器、國際化等功能

20.2?創(chuàng)建項(xiàng)目添加thymeleaf的依賴

?


<dependency>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

20.3?Spring Boot項(xiàng)目Thymeleaf模板頁面存放位置

查看Thymeleaf的自動配置類

?


?

當(dāng)然我們也可以自己修改他的位置,只需要在yml文件中修改即可,一般不做修改

?


20.4?通過Controller跳轉(zhuǎn)到Thymeleaf的頁面

20.4.1?在指定位置下創(chuàng)建hello.html

<!DOCTYPE html>
<html lang="en">
<head>
????<meta charset="UTF-8">
????<title>hello</title>
</head>
<body>
<h1>hello Thymeleaf</h1>
<h1>我是classpath:/templates/hello.html</h1>
</body>
</html>

20.4.2?創(chuàng)建RouteController類

@Controller
public class RouteController {

????@GetMapping("hello")
????public String hello(){
????????return "hello";
????}

}

20.4.3?測試訪問

http://localhost:8080/hello?

?

?

20.5?Thymeleaf的相關(guān)語法

官網(wǎng):https://www.thymeleaf.org/??

表達(dá)式

l?${...} 取作用域里面的值 request session applicationContext

l?#{...} 取IOC容器中的值

l?@{...} URL表達(dá)式 th:href=@{/test(name=abc,pwd=123)}

l?th:text 標(biāo)簽中取字面值

l?th:each 遍歷

?

表達(dá)式基本對象

l?#locale 本地環(huán)境

l?#httpServletRequest??HttpServletRquest對象

l?#httpSession???HttpSession對象

l?#servletContext??servletContext對象

?

常用工具對象

l?#numbers??格式化數(shù)字對象的實(shí)用方法

l?#strings??字符串對象的實(shí)用方法:包含startsWith,將/附加等

l?#dates ???java.util的實(shí)用方法。對象:日期格式、組件提取等

l?#objects:實(shí)用方法的對象。

l?#bools:布爾評價的實(shí)用方法。

l?#arrays:數(shù)組的實(shí)用方法。

l?#lists:list集合。

l?#sets:set集合。

l?#maps:map集合。

l?#aggregates:實(shí)用程序方法用于創(chuàng)建聚集在數(shù)組或集合.

l?#ids:實(shí)用程序方法來處理可能重復(fù)的id屬性(例如,由于迭代)。

20.6?Thymeleaf讀取Model里面的對象

20.6.1?創(chuàng)建Hero類

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hero {
????private Integer id;
????private String name;
????private String sex;
????private Integer age;
????private String country;
????private String phone;
????private Date birth;
????private Double salary;
}

20.6.2?在RouteController增加一個方法跳轉(zhuǎn)

@GetMapping("helloHero")
public String helloHero(Model model) {
????Hero hero = new Hero(1, "后羿", "男", 18, "中國", "110", new Date(), 3150D);
????model.addAttribute("hero", hero);
????return "showHero";
}

20.6.3?創(chuàng)建showHero頁面

20.6.4?測試訪問

http://localhost:8080/helloHero?

?

20.7?Thymeleaf讀取Model里面的集合

20.7.1?在RouteController增加一個方法跳轉(zhuǎn)

20.7.2?創(chuàng)建showHeroList頁面

20.7.3?測試訪問

http://localhost:8080/helloHeroList?

?

20.8?ThymeleafObjects的使用

20.8.1?在RouteController增加一個方法跳轉(zhuǎn)

@GetMapping("thymeleafObject")
public String thymeleafObject(Model model, HttpServletRequest request){
????model.addAttribute("name","超人");
????request.setAttribute("age",22);
????HttpSession session = request.getSession();
????session.setAttribute("address","武漢");
????request.getServletContext().setAttribute("hobby","編碼");
????return "showObj";
}

20.8.2?創(chuàng)建showObj頁面

20.8.3?測試訪問

http://localhost:8080/thymeleafObject?

?


20.9?Thymeleaf在js中取值

<script>
????// 字符串需要引號
????let name = "[[${name}]]"
????// 數(shù)字類型不需要引號
????let age = [[${age}]]
????console.log(name)
????console.log(age)
</script>

20.10?Thymeleaf鏈接接傳值

20.10.1?創(chuàng)建一個按鈕

<a th:href="@{/testGetParam(name='abc',pwd='123456')}">點(diǎn)擊傳值</a>

20.10.2?在RouteController增加一個方法

@GetMapping("testGetParam")
@ResponseBody
public String testGetParam(String name,String pwd){
????System.out.println(name);
????System.out.println(pwd);
????return "ok";
}

21.?SpringBoot自動管理MVC分析

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-web-applications.spring-mvc.auto-configuration?

?


21.1?查看WebMvcAutoConfiguration及其靜態(tài)內(nèi)部類

Mvc幫我們做了哪些事情?

1.(請求分發(fā) --dispatcherServlet)

2.適配器 ?--requestMappingHandlerAdapter

3.消息轉(zhuǎn)換 ?--MessageConverter

4.視圖解析 ?--(ContentNegotiatingViewResolver)

5.格式化 ?--addFormatters

6.....

21.2?具體查看視圖解析

在ContentNegotiatingViewResolver內(nèi)容視圖協(xié)商解析器中初始化servletContext的時候,把加載的所有視圖解析器收集了起來

?


這里總結(jié)出:只要IOC容器里面實(shí)現(xiàn)了viewResolver接口的,都可以被收集起來

?


21.3?具體查看文件上傳下載

MultipartAutoConfiguration中幫我們自動配置了

?


MultipartProperties配置文件中可以設(shè)定參數(shù),可以的yml文件里面配置

?


21.4?具體查看格式化【接收頁面參數(shù)并轉(zhuǎn)化】

在WebMvcAutoConfiguration中的addFormatters

?


我們可以看到默認(rèn)配置了很多轉(zhuǎn)換規(guī)則

?


我們也可以配置文件中自己配置

spring:
????mvc:
????????format:
????????????date-time: yyyy-MM-dd HH:mm:ss

版本說明

format.date ?----java.utils.Date

format.date-time ?---java.time.LocalDateTime

21.5?歡迎頁面自動配置

?


?

22.?擴(kuò)展MVC的組件【了解】

創(chuàng)建一個配置類實(shí)現(xiàn)WebMvcConfigurer重寫之前的方法即可實(shí)現(xiàn)自定義拓展

22.1?自定義視圖解析器【熟悉】

這樣我們就不需要寫controller

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {


????@Override
????public void addViewControllers(ViewControllerRegistry registry) {
????????// 轉(zhuǎn)發(fā)的控制器注冊
????????registry.addViewController("/test")
????????????????.setViewName("test");
????????// 重定向的控制器注冊
????????registry.addRedirectViewController("/tobaidu", "https://www.baidu.com");
????}
}

22.2?自定義攔截器【掌握】

22.2.1?創(chuàng)建自己的攔截器

22.2.2?注冊到webMvc管理

23.?注冊Web三大組件【重點(diǎn)】

Servlet

|--@WebServlet

|--web.xml

Filter

|--@WebFilter

|--web.xml

Listener

|--@WebListener

|--web.xml

?

首先查看注冊組件的結(jié)構(gòu)

?

23.1?注冊自己的Servlet

我們可以模仿DispatcherServlet的注冊方式

23.1.1?創(chuàng)建UserServlet

23.1.2?在配置類注冊自己的servlet

23.2?注冊自己的Filter

23.2.1?創(chuàng)建MyFilter

23.2.2?在配置類里注冊自己的過濾器

23.3?注冊自己的Listener

23.3.2?在配置類里面注冊自己的監(jiān)聽器

@Autowired
private MyListener myListener;

@Bean
public ServletListenerRegistrationBean<MyListener> myListenerServletListenerRegistrationBean(){
????ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>();
????registrationBean.setListener(myListener);
????return registrationBean;
}

24.?數(shù)據(jù)源配置和自動管理【重中之中】

24.1?創(chuàng)建項(xiàng)目選擇依賴

?


24.2?創(chuàng)建數(shù)據(jù)庫

?


24.3?使用DriverManagerDataSource

24.3.1?修改配置文件

spring:
????datasource:
????????driver-class-name: com.mysql.cj.jdbc.Driver
????????type: org.springframework.jdbc.datasource.DriverManagerDataSource # spring自帶的數(shù)據(jù)源
????????url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
????????username: root
????????password: root

24.3.2?測試

?


24.4?使用Druid數(shù)據(jù)源【自己配置】

24.4.1?添加durid的依賴

<dependency>
????<groupId>com.alibaba</groupId>
????<artifactId>druid</artifactId>
????<version>1.2.6</version>
</dependency>

24.4.2?添加MyDruidProperties配置文件類

24.4.3?添加MyDruidAutoConfiguration自動配置類

24.4.4?修改yml配置文件

24.4.5?測試訪問

http://localhost:8080/druid?

?

24.5?使用Druid數(shù)據(jù)源【官方starter】

<dependency>
????<groupId>com.alibaba</groupId>
????<artifactId>druid-spring-boot-starter</artifactId>
????<version>1.2.6</version>
</dependency>

24.5.1?修改配置文件

25.?集成mybatis【重點(diǎn)】

25.1?創(chuàng)建數(shù)據(jù)庫并且新增測試數(shù)據(jù)

?


25.2?創(chuàng)建新模塊并添加依賴

25.3?根據(jù)數(shù)據(jù)庫創(chuàng)建User對象(逆向工程)

?


25.4?修改yml配置文件

spring:
????datasource:
????????driver-class-name: com.mysql.cj.jdbc.Driver
????????url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=GMT%2B8
????????username: root
????????password: root
????????type: com.alibaba.druid.pool.DruidDataSource
????????druid:
????????????max-active: 10
????????????min-idle: 2
????????????validation-query: select 'x'
????????????stat-view-servlet:
????????????????login-username: admin
????????????????enabled: true ?#啟用監(jiān)控頁
????????????????login-password: admin
????????????????allow:
????????????????deny:
????????????????url-pattern: /druid/*
mybatis:
????mapper-locations: classpath:mapper/*.xml ?# mapper.xml文件位置
????configuration:
????????log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ?# sql日志輸出

25.5?修改啟動類

?


25.6?測試查詢

?


25.7?使用注解的方式

/**
?* 在mapper接口的方法上使用注解的方式
?* @Select
?* @Update
?* @Insert
?* @Delete
?*
?* @return
?*/
@Select("select *?from user")
List<User> selectAllUser();

?


25.8?配置PageHelper插件分頁(第一種,不推薦)

25.8.1?依賴pageHelper

<dependency>
????<groupId>com.github.pagehelper</groupId>
????<artifactId>pagehelper</artifactId>
????<version>5.2.1</version>
</dependency>

25.8.2?創(chuàng)建mybatis-cfg.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
????????PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
????????"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
????<settings>
????????<setting name="logImpl" value="STDOUT_LOGGING"/>
????</settings>
????<plugins>
????????<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
????</plugins>
</configuration>

25.8.3?修改application.yml文件

mybatis:
????mapper-locations: classpath:mapper/*.xml ?# mapper.xml文件位置
????config-location: classpath:mybatis-cfg.xml # 指定配置文件

25.8.4?測試分頁

?


25.9?配置PageHelper插件分頁(第二種,推薦)

25.9.1?依賴pageHelper的starter

25.9.2?刪除mybatis-cfg.xml文件后修改yml文件

mybatis:
????configuration:
????????log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ?# sql日志輸出
????mapper-locations: classpath:mapper/*.xml ?# mapper.xml文件位置
# ???config-location: classpath:mybatis-cfg.xml # 指定配置文件

25.9.3?測試查詢分頁

?


25.10?事務(wù)管理

和spring里面一樣的,但是在boot里面只要在XXXXServiceImpl上Transactionl

@Override
@Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.REQUIRED)
public int addUser(User user) {
????int i = userMapper.insert(user);
????int a = 10 / 0;
????return i;
}

25.11?boot和mybatis的集成的總結(jié)

1,創(chuàng)建項(xiàng)目導(dǎo)依賴

2,配置數(shù)據(jù)源[修改yml]

3,配置mybatis[修改yml]

4,配置mapper接口掃描

5,使用

?

26.?使用外部tomcat【了解】

Springboot項(xiàng)目里面默認(rèn)不支持jsp 它是使用模板引擎[thymeleaf]

Springboot不支持jsp的原因是因?yàn)閮?nèi)置的tomcat不支持jsp

26.1?創(chuàng)建項(xiàng)目,選擇打包方式為war包

?


26.2?選擇依賴

?


26.3?配置pom.xml

26.4?添加IDEA配置

?

?



26.5?配置外部tomcat

?

?


26.6?創(chuàng)建controller

@Controller
public class TestController {

????@GetMapping("test")
????public String test(){
????????return "test";
????}
}

26.7?創(chuàng)建頁面

?


26.8?修改配置文件

spring:
????mvc:
????????view:
????????????prefix: /WEB-INF/view/
????????????suffix: .jsp

26.9?啟動訪問

http://localhost:8080/test?


27.?集成swagger【熟悉】

27.1?問題描述

隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,現(xiàn)在的網(wǎng)站架構(gòu)基本都由原來的后端渲染,變成了:前端渲染、前后端分離的形態(tài),而且前端技術(shù)和后端技術(shù)在各自的道路上越走越遠(yuǎn)。 前端和后端的唯一聯(lián)系,變成了API接口;API文檔變成了前后端開發(fā)人員聯(lián)系的紐帶,變得越來越重要,swagger就是一款讓你更好的書寫API文檔的框架,而且swagger可以完全模擬http請求,入?yún)⒊鰠⒑蛯?shí)際情況差別幾乎為零。

沒有API文檔工具之前,大家都是手寫API文檔的(維護(hù)起來相當(dāng)困難),在什么地方書寫的都有,有在confluence上寫的,有在對應(yīng)的項(xiàng)目目錄下readme.md上寫的,每個公司都有每個公司的玩法,無所謂好壞。但是能稱之為“框架”的,估計(jì)也只有swagger了



27.2?使用步驟

27.2.1?創(chuàng)建項(xiàng)目加入依賴

27.2.2?創(chuàng)建SwaggerProperties信息配置類

27.2.3?創(chuàng)建SwaggerAutoConfiguration自動配置類

27.2.4?修改yml文件

27.2.5?創(chuàng)建Hero類

27.2.6?創(chuàng)建Controller

27.2.7?測試訪問文檔頁面

http://localhost:8080/swagger-ui/index.html?

27.2.8?測試接口

?


27.2.9?補(bǔ)充注解說明

https://gumutianqi1.gitbooks.io/specification-doc/content/tools-doc/spring-boot-swagger2-guide.html?

?


28.?Spring Boot異步

同步:

異步:

java里面這病異步就是多線程

springboot里面的異步,就是為開發(fā)者提供了種快速使用多線程的方式

New Thread().start();

28.1?概述

28.1.1?什么是異步調(diào)用?

異步調(diào)用是相對于同步調(diào)用而言的,同步調(diào)用是指程序按預(yù)定順序一步步執(zhí)行,每一步必須等到上一步執(zhí)行完后才能執(zhí)行,異步調(diào)用則無需等待上一步程序執(zhí)行完即可執(zhí)行。

28.1.2?如何實(shí)現(xiàn)異步調(diào)用?

多線程,這是很多人第一眼想到的關(guān)鍵詞,沒錯,多線程就是一種實(shí)現(xiàn)異步調(diào)用的方式。

在非spring目項(xiàng)目中我們要實(shí)現(xiàn)異步調(diào)用的就是使用多線程方式,可以自己實(shí)現(xiàn)Runable接口或者集成Thread類,或者使用jdk1.5以上提供了的Executors線程池。

StrngBoot中則提供了很方便的方式執(zhí)行異步調(diào)用。

28.1.3?異步接口的使用場景

耗時比較長,任務(wù)比較多的接口。比方說,文件下載,大文件下載比較耗時,這個時候就可以使用異步接口。還有就是對用戶接下來操作沒有影響的寫庫之類

28.2?最佳實(shí)踐

28.2.1?創(chuàng)建項(xiàng)目選擇依賴

?


28.2.2?創(chuàng)建Controller接口測試

28.2.3?修改啟動類開啟異步功能

?


28.2.4?訪問測試

http://localhost:8080/doAsync?

發(fā)現(xiàn)測試結(jié)果并沒有異步

?


28.2.5?異步并沒有執(zhí)行?

難道是代碼寫錯了?反復(fù)檢查了好幾遍,并沒有發(fā)現(xiàn)什么明顯錯誤,想起spring對@Transactional注解時也有類似問題,spring掃描時具有@Transactional注解方法的類時,是生成一個代理類,由代理類去開啟關(guān)閉事務(wù),而在同一個類中,方法調(diào)用是在類體內(nèi)執(zhí)行的,spring無法截獲這個方法調(diào)用。

豁然開朗,將異步任務(wù)單獨(dú)放到一個類中,調(diào)整代碼入下

28.2.6?添加異步任務(wù)類

28.2.7?修改Controller接口測試

28.2.8?再次測試

?


29.?Spring Boot定時任務(wù)

需求:領(lǐng)導(dǎo)說,每天晚上12把前一天的銷售統(tǒng)計(jì)報表發(fā)給我

寫一個任務(wù)

1,從數(shù)據(jù)庫里面取數(shù)據(jù)進(jìn)行處理

2,寫一個定時任務(wù) 每天12點(diǎn)之前執(zhí)行

3,從數(shù)據(jù)庫里面查詢數(shù)據(jù)處理完成之后以郵件的形式發(fā)送給領(lǐng)導(dǎo)

29.1?概述

- sprignBoot定時任務(wù)是與quartz整合,不需要添加任何的依賴

- 在springBoot的啟動類上添加`@EnableScheduling`注解開啟定時調(diào)度

- 在需要定時調(diào)度的方法上添加`@Scheduled`這個注解即可,其中可以指定cron表達(dá)式和其他的定時方式

29.2?最佳實(shí)踐

29.2.1?開啟定時任務(wù)

?


29.2.2?執(zhí)行任務(wù)

30.?Spring Boot郵件發(fā)送

30.1?概述

SpringBoot實(shí)現(xiàn)郵件功能是非常的方便快捷的,因?yàn)镾pringBoot默認(rèn)有starter實(shí)現(xiàn)了Mail。

發(fā)送郵件應(yīng)該是網(wǎng)站的必備功能之一,什么注冊驗(yàn)證,忘記密碼或者是給用戶發(fā)送營銷信息。

最早期的時候我們會使用JavaMail相關(guān)api來寫發(fā)送郵件的相關(guān)代碼,后來spring退出了JavaMailSender更加簡化了郵件發(fā)送的過程,在之后springboot對此進(jìn)行了封裝就有了現(xiàn)在的spring-boot-starter-mail。

30.2?最佳實(shí)踐

先去qq郵箱設(shè)置smtp開啟,并獲得授權(quán)碼

郵箱->設(shè)置->賬戶->POP3/SMTP服務(wù):開啟服務(wù)后會獲得授權(quán)碼


30.2.1?創(chuàng)建項(xiàng)目引入依賴(mail)

?

30.2.2?修改yml配置文件

30.2.3?編寫測試發(fā)送郵件

?

?


更多干貨我們下期再說!

下期會分享

第十五章節(jié)

Docker

相關(guān)知識~

下期見!




?

?


教程揭秘 | 動力節(jié)點(diǎn)內(nèi)部Java零基礎(chǔ)教學(xué)文檔第十四篇:SpringBoot的評論 (共 條)

分享到微博請遵守國家法律
平安县| 衡南县| 宜春市| 桂林市| 湾仔区| 吴桥县| 明光市| 济南市| 贵阳市| 双辽市| 珠海市| 淄博市| 镇平县| 马尔康县| 防城港市| 鞍山市| 景谷| 祁阳县| 哈巴河县| 涡阳县| 喀喇沁旗| 凤凰县| 平顶山市| 田林县| 乐业县| 沙坪坝区| 宜阳县| 金乡县| 凤台县| 永和县| 合作市| 上蔡县| 望奎县| 丰都县| 郓城县| 田东县| 北碚区| 天津市| 济阳县| 阳原县| 阿拉善左旗|