Springboot
?Springboot
?
文檔地址: https://www.yuque.com/atguigu/springboot
文檔不支持舊版本IE、Edge瀏覽器,請(qǐng)使用chrome或者firefox
視頻地址: http://www.gulixueyuan.com/ https://www.bilibili.com/video/BV19K4y1L7MT?p=1
源碼地址:https://gitee.com/leifengyang/springboot2
基礎(chǔ)入門--Hello World
首先,創(chuàng)建maven工程,并引入對(duì)應(yīng)的依賴:
<parent> ? ? ? ?<groupId>org.springframework.boot</groupId> ? ? ? ?<artifactId>spring-boot-starter-parent</artifactId> ? ? ? ?<version>2.3.4.RELEASE</version> ? ?</parent> ? ?<dependencies> ? ? ? ?<dependency> ? ? ? ? ? ?<groupId>org.springframework.boot</groupId> ? ? ? ? ? ?<artifactId>spring-boot-starter-web</artifactId> ? ? ? ?</dependency> ? ?</dependencies>
?
接著,創(chuàng)建一個(gè)spirngboot的主程序:
/** * 主程序類 * @SpringBootapplication 這是一個(gè)SpirngBoot應(yīng)用 */ @SpringBootapplication public class Mainapplication { ? ?public static void main(String[] args) { ? ? ? ?Springapplication.run(Mainapplication.class,args); ? ?} }
接著創(chuàng)建controller層。
在springBoot中,有controller和Responbody的復(fù)合注解:RestController
然后只需要在spirngboot的主程序中啟動(dòng),即可在瀏覽器中打開;
配置文件
配置中都是能抽取出來為全局使用的
自動(dòng)配置
ConfigurableapplicationContext run = Springapplication.run(Mainapplication.class, args);
主程序類中,返回的是一個(gè)包含很多的IOC容器。
默認(rèn)的包結(jié)構(gòu):
主程序所在包及其下面的所有子包里面的組件都會(huì)被默認(rèn)掃描。
想要改變掃描路徑,@SpringBootapplication(scanBasePackages="com.atguigu")
或者@ComponentScan 指定掃描路徑
容器功能
--Spring中注冊(cè)了一個(gè)組件交給容器管理后,而在容器中,這是單實(shí)例的,不管獲取多少次,都還是這個(gè)組件。
使用注解代替xml來注冊(cè)組件。
1、配置類里面使用@Bean標(biāo)注在方法上給容器注冊(cè)組件,默認(rèn)也是單實(shí)例的。
2、配置類本身也是組件
3、如果@Configuration(proxyBeanMethods = true) 代理對(duì)象調(diào)用方法。SpringBoot總會(huì)檢查這個(gè)組件是否在容器中有。如果有,就不會(huì)新創(chuàng),保證單實(shí)例。如果是false,那么就會(huì)變成多實(shí)例了。
外部無論對(duì)配置類中的這個(gè)組件注冊(cè)方法調(diào)用多少次獲取的都是之前注冊(cè)容器的單實(shí)例對(duì)象。
組件依賴:比如用戶養(yǎng)的寵物,如果是true,那么從用戶中取出寵物的class和從容器中取出寵物的class是相同的。
調(diào)成false的優(yōu)勢(shì):Spring就不會(huì)檢查是否會(huì)有這個(gè)代理對(duì)象,跳過了檢查,啟動(dòng)就會(huì)非??臁?/p>
Full模式與Lite模式
示例
最佳實(shí)戰(zhàn)
配置 類組件之間無依賴關(guān)系用Lite模式加速容器啟動(dòng)過程,減少判斷
配置類組件之間有依賴關(guān)系,方法會(huì)被調(diào)用得到之前單實(shí)例組件,用Full模式
4、@Import注解
* 4、@Import({User.class, DBHelper.class}) * ? ? ?給容器中自動(dòng)創(chuàng)建出這兩個(gè)類型的組件、默認(rèn)組件的名字就是全類名 * * * */ @Import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods = false) //告訴SpringBoot這是一個(gè)配置類 == 配置文件 public class MyConfig { }
@Conditional
條件裝配
配置綁定
springIOC管理,當(dāng)bean加入了容器交給了Spirng管理的時(shí)候,就能在配置文件中,直接去修改這個(gè)組件的某個(gè)屬性的值。
屬性綁定:@ConfigurationProperties(prefix="xxx")
@EnableConfigurationProperties(car.class):
1、開啟car配置綁定功能
2、把這個(gè)car組件自動(dòng)注冊(cè)到容器中
場(chǎng)景問題:當(dāng)引用第三方包時(shí),不能在其bean上標(biāo)注@component,但可以使用@EnableConfigurationProperties
SpirngBoot默認(rèn)會(huì)在底層配好所有的組件,但是如果用戶自己配置了以用戶的優(yōu)先
總結(jié)
SpringBoot先加載所有的自動(dòng)配置類 xxxxxAutoConfiguration
每個(gè)自動(dòng)配置類按照條件進(jìn)行生效,默認(rèn)都會(huì)綁定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件進(jìn)行了綁定
生效的配置類就會(huì)給容器中裝配很多組件
只要容器中有這些組件,相當(dāng)于這些功能就有了
定制化配置
用戶直接自己@Bean替換底層的組件
用戶去看這個(gè)組件是獲取的配置文件什么值就去修改。
xxxxxAutoConfiguration ---> 組件 ---> xxxxProperties里面拿值 ----> application.properties
最佳實(shí)踐
開發(fā)小技巧
Lombok
get、set、toString方法:@Date
全參構(gòu)造器:@AllArgsConstructor
無參構(gòu)造器:@NoArgsConstructor
Hashcode:@EqualsAndHashCode
日志屬性添加:@Slf4j :
直接可以在對(duì)應(yīng)的地方加上: log.info("xxx");
<dependency> ? ? ? ? ? ?<groupId>org.projectlombok</groupId> ? ? ? ? ? ?<artifactId>lombok</artifactId> ? ? ? ?</dependency> idea中搜索安裝lombok插件
dev-tools
項(xiàng)目或者頁面修改以后:Ctrl+F9;
<dependency> ? ? ? ? ? ?<groupId>org.springframework.boot</groupId> ? ? ? ? ? ?<artifactId>spring-boot-devtools</artifactId> ? ? ? ? ? ?<optional>true</optional> ? ? ? ?</dependency>
Spring Initailizr(項(xiàng)目初始化向?qū)В?/p>
核心功能篇
配置文件
yaml
1.2.2、基本語法
key: value;kv之間有空格
大小寫敏感
使用縮進(jìn)表示層級(jí)關(guān)系
縮進(jìn)不允許使用tab,只允許空格
縮進(jìn)的空格數(shù)不重要,只要相同層級(jí)的元素左對(duì)齊即可
'#'表示注釋
字符串無需加引號(hào),如果要加,''與""表示字符串內(nèi)容 會(huì)被 轉(zhuǎn)義/不轉(zhuǎn)義
雙引號(hào)不會(huì)轉(zhuǎn)義,單引號(hào)會(huì)轉(zhuǎn)義
Web開發(fā)
2、簡單功能分析
2.1、靜態(tài)資源訪問
1、靜態(tài)資源目錄
只要靜態(tài)資源放在類路徑下: called?/static?(or?/public?or?/resources?or?/META-INF/resources
訪問 : 當(dāng)前項(xiàng)目根路徑/ + 靜態(tài)資源名
原理: 靜態(tài)映射/**。
請(qǐng)求進(jìn)來,先去找Controller看能不能處理。不能處理的所有請(qǐng)求又都交給靜態(tài)資源處理器。靜態(tài)資源也找不到則響應(yīng)404頁面
改變默認(rèn)的靜態(tài)資源路徑
spring: ?mvc: ? ?static-path-pattern: /res/** ?resources: ? ?static-locations: [classpath:/haha/]
2、靜態(tài)資源訪問前綴
默認(rèn)無前綴
spring: ?mvc: ? ?static-path-pattern: /res/**
當(dāng)前項(xiàng)目 + static-path-pattern + 靜態(tài)資源名 = 靜態(tài)資源文件夾下找
3、webjar
自動(dòng)映射 /webjars/**
https://www.webjars.org/
<dependency> ? ? ? ? ? ?<groupId>org.webjars</groupId> ? ? ? ? ? ?<artifactId>jquery</artifactId> ? ? ? ? ? ?<version>3.5.1</version> ? ? ? ?</dependency>
訪問地址:http://localhost:8080/webjars/jquery/3.5.1/jquery.js 后面地址要按照依賴?yán)锩娴陌窂?/p>
2.2、歡迎頁支持
靜態(tài)資源路徑下 index.html
可以配置靜態(tài)資源路徑
但是不可以配置靜態(tài)資源的訪問前綴。否則導(dǎo)致 index.html不能被默認(rèn)訪問
spring: # ?mvc: # ? ?static-path-pattern: /res/** ? 這個(gè)會(huì)導(dǎo)致welcome page功能失效 ?resources: ? ?static-locations: [classpath:/haha/]
controller能處理/index
2.3、自定義 Favicon
favicon.ico 放在靜態(tài)資源目錄下即可。
spring: # ?mvc: # ? ?static-path-pattern: /res/** ? 這個(gè)會(huì)導(dǎo)致 Favicon 功能失效
如果一個(gè)配置類只有一個(gè)有參構(gòu)造器,那么其所有屬性的值,都會(huì)默認(rèn)從容器中找。
小記:@responseBody 是將后端返回的數(shù)據(jù)封裝成json串
矩陣變量,分號(hào)的形式:
/cars/sell;low=34;brand=byd/xxx;xx=xx
自定義convert:相當(dāng)于在配置類中進(jìn)行方法的重寫
3、開啟瀏覽器參數(shù)方式內(nèi)容協(xié)商功能
為了方便內(nèi)容協(xié)商,開啟基于請(qǐng)求參數(shù)的內(nèi)容協(xié)商功能。
spring: ? ?contentnegotiation: ? ? ?favor-parameter: true ?#開啟請(qǐng)求參數(shù)內(nèi)容協(xié)商模式
發(fā)請(qǐng)求: http://localhost:8080/test/person?format=json
http://localhost:8080/test/person?format=xml
format后面帶上具體想要的方式
視圖解析 ?渲染
使用模板引擎渲染:
表單發(fā)送(轉(zhuǎn)發(fā)重定向),刷新仍停留上一次發(fā)送的請(qǐng)求(表單的post),但是不能直接重定向,因?yàn)榉庆o態(tài)資源,模板引擎templates文件夾下所有的頁面都需要經(jīng)過請(qǐng)求處理(controller),最后由模板的渲染。
要被thymeleaf解析,每一個(gè)html都要加上thymeleaf的名稱空間。
文件上傳
異常處理
導(dǎo)入的服務(wù)器只能有一個(gè),不然會(huì)報(bào)錯(cuò)。
數(shù)據(jù)訪問
maven的最短路徑原則 通過最短路徑,最佳匹配來直接修改mysql驅(qū)動(dòng)版本
自定義datasource版本時(shí),可以通過@Bean方式添加組件,返回一個(gè)Datasource,同時(shí),可以綁定配置文件:
@ConfigurationProperties("")
單元測(cè)試
Junit5
springboot整合了Junit5的功能,junit類具有Spring的功能,@Autowire,比如@Transactional標(biāo)注測(cè)試方法,測(cè)試完成后自動(dòng)回滾;
特性
@EnableConfigurationProperties(xxx.class) ?將對(duì)應(yīng)類和配置文件綁定并且自動(dòng)放到容器中