教程揭秘 | 動力節(jié)點(diǎn)內(nèi)部Java零基礎(chǔ)教學(xué)文檔第十四篇:SpringBoot
接上期后續(xù)
本期分享第十四章節(jié)
Spring Boot
已經(jīng)分享一大半了,你們都跟上了嗎?
每天都在學(xué)習(xí)嘛?
有什么不會的嘛?
今日教學(xué)文檔分享來了?

今日新篇章
【SpringBoot】
SSM
Springboot
分布式微服務(wù)
1.?Spring的發(fā)展
回顧:Spring是一個開源框架,2003年興起的一個輕量級的Java 開發(fā)框架,作者:Rod Johnson。Spring是為了解決企業(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的注解,生成get和set方法
@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)知識~
下期見!

?
?