javascript
SpringBoot笔记
文章目錄
- 1?? 簡介
- 一. 什么是 IoC 容器?
- 二. AOP面向切面編程
- 三. SSM整合
- 四. HttpServletRequest
- 五. HttpServletResponse
- 六. Cookie 與 Session
- 七. Cookie
- 八. Session
- 九. 轉發與重定向
- 十. Spring項目轉SpringBoot
- 十一. Spring生命周期
- 十二. 什么是 pom
- 十三. 為什么會返回JSON格式數據
- 十四. 跨域請求 CORS
- 2?? Spring基礎知識
- 一. 注解開發說明
- 二. 配置 Bean
- 三. 配置第三方 Bean
- 四. 單例與多實例
- 五. @Autowired說明
- 六. Bean的生命周期
- 七. 條件裝配:Bean加載控制
- 八. 為Bean內的變量賦值
- 九. Spring事務管理
- 十. JdbcTemplate解釋
- 十一. P命名空間
- 十二. 關閉ApplicationContext
- 十三. 完全注解開發
- 十四. 獲取 Bean
- 十五. 導入其他配置項
- 十六. Bean的分類
- 3?? Spring MVC基礎知識
- 一. MVC簡介
- 二. 衍生的 Bean注解
- 三. 路徑疊加
- 四. RESTful風格
- 五. @RequestMapping詳解
- 六. 路徑 ant風格
- 七. 非 RESTful風格說明
- 八. 域共享對象
- 九. ModelAndView
- 十. 請求響應擴展
- 十一. MVC工作流程
- 十二. 文件下載
- 十三. 文件上傳
- 十四. 攔截、過濾、分發器總結
- 十五. @RequestParam、@PathVariable區別
- 十六. 視圖解析器
- 十七. SpringMVC執行流程
- 十八. Thymeleaf說明
- 4?? SpringBoot小知識點
- 5?? SpringBoot基礎知識
- 一. 初始項目結構
- 二. delete、put請求說明
- 三. jar包與 war包的區別
- 四. start 與 parent的區別
- 五. @SpringBootApplication說明
- 六. #{ }與 ${ }說明
- 七. @ControllerAdvice說明
- 八. 臨時配置說明
- 九. yml格式說明
- 十. 松散綁定說明
- 6?? SpringBoot常用操作
- 一. 頁面跳轉
- 二. 注解方式獲取請求頭
- 三. 注解方式獲取Cookie
- 四. 編碼格式修改
- 五. 發送郵件
- 六. Scheduled定時任務
- 七. Cron格式編寫指南
- 八. SpringBootAdmin監控
- 九. 消息中間件
- 十. 自定義錯誤頁
- 十一. Slf4j日志使用
- 十二. 靜態資源訪問
- 十三. 路徑映射
- 十四. 服務器日志
- 十五. 多環境開發 Profile
- 十六. 優先執行的代碼
- 十七. 異常處理器
- 十八. 配置日志等級
- 十九. 兼容xml配置文件
- 二十. 讀取標準 yml配置
- 二十一. 讀取第三方 yml配置
- 二十二. 攔截器
- 二十三. 頁面跳轉
- 7?? SpringBoot常用技巧
- 一. 獲取UUID的正確姿勢
- 二. 全路徑名
- 三. 頁面重定向
- 四. 表格的畫法
- 五. yml中相互引用
- 六. 隨時獲取 ApplicationContext
- 七. 網站圖標 favicon
- 八. 跳過測試模塊
- 九. 排除自動配置
- 十. 查看 pom組件版本
- 十一. 正確的項目創建流程
- 十二. 離線創建SpringBoot程序
- 十三. 快速制作程序模板
- 十四. Tomcat替換成Jetty
- 十五. 修改Banner
- 十六. 測試中開啟服務器配置
- 十七. 測試中開啟事務
- 十八. 測試中的臨時屬性
- 十九. @JsonIgnore
- 二十. 項目打包構建
- 二十一. IDEA隱藏文件
- 二十二. jdk8單位類
- 8?? SpringBoot不常用操作
- 1. 修改配置文件名
- 2. maven控制yml環境
- 3. JDBC使用
- 4. 熱部署
- 5. 開啟 Bean校驗
- 6. 代碼中編寫測試
- 7. 測試用例中設置隨機數據
- 9?? 整合第三方
- 一. 整合Mybatis
- 二. 整合MybatisPlus
- 三. 整合Druid
- 🔟 Spring Security
- 一. 簡介
- 二. 使用步驟
- 三. 自定義登錄頁面與返回值
- 四. 注銷登錄
- 五. 加鹽 Salt
- 六. 使用注解進行配置
- 七. 持久層存儲:數據庫
- 八. 令牌技術:token
- 九. WebSocket
- 十. Swagger2
1?? 簡介
一. 什么是 IoC 容器?
簡介
Inversion of Control 控制反轉,
又稱為依賴注入 DI ——Dependency Injection。
解決痛點
大型程序之間的高耦合性與冗余性,共享組件、統一銷毀。
底層原理
XML解析、工廠模式、反射。
IOC容器底層就是對象工廠。
意義
? 傳統的應用程序中,控制權在程序本身,程序的控制流程完全由開發者控制。在IoC模式下,控制權發生了反轉,即從應用程序轉移到了IoC容器,所有組件不再由應用程序自己創建和配置,而是由IoC容器負責,這樣,應用程序只需要直接使用已經創建好并且配置好的組件。為了能讓組件在IoC容器中被“裝配”出來,需要某種“注入”機制,其將組件的創建+配置與組件的使用相分離,并且,由IoC容器負責管理組件的生命周期。
總結:Ioc意味著將你設計好的對象交給容器控制,而不是按照傳統在對象內部直接控制
小點:
- 在 Spring IoC程序中,我們把所有的組件統稱為 Java Bean。
- Spring容器是通過讀取XML文件后使用反射完成的,其實所有的配置文件差不多都是這樣,Java的反射機制。
- Spring容器就是 ApplicationContext,它是一個接口,有很多實現類,這里我們選擇 ClassPathXmlApplicationContext,表示它會自動從classpath中查找指定的XML配置文件。
- Spring還提供了另外一種IoC容器:懶加載對象 BeanFactory。使用方法和 ApplicationContext一樣,但是懶加載主要是第一次獲取時才會加載指定的 Bean對象,而 ApplicationContext則會在創建時一次性加載所有的 Bean對象。
二. AOP面向切面編程
簡介:
? SpringBoot支持面向切面編程,其可以在不改動原代碼的動態添加代碼、動態刪去代碼。這在日志記錄、安全檢查和事務等方面很有用。AOP技術本質上就是一個動態代理,讓我們可以把一些常用功能如權限檢查、日志、事務從業務方法中剝離出來。
題外話:
? Spring的 AOP實現基于 JVM的動態代理,所以我們有時候也會這樣子形容——AOP代理、AOP代理對象,意即AOP代理了本來的類對象。
在 Java平臺上對于AOP的織入,一共有三種方式:
- 編譯器:由編譯器把切面編譯進字節碼,使用aspect關鍵字。
- 類加載器:利用一個特殊的類加載器,在目標類被裝載到JVM時,對目標類的字節碼文件進行重新加強。
- 運行期:目標對象和切面都是普通的Java類,通過JVM的動態代理對象功能或者第三方庫實現運行期間動態織入。(最簡單的方式)
原理解釋:
? Spring對接口類型使用JDK動態代理,對普通類使用CGLIB創建子類,在之后使用的也是它的子類,但對于用戶來說是無感的。如果一個Bean的class是final,Spring將無法為其創建子類。
// 原類為 UserTest,打印出來可以看到被 Spring enhance // 并非原類,為其子類。 class com.thinkstu.test.UserTest$$EnhancerBySpringCGLIB$$217a2220AOP:Aspect-Orinented Programing 面向切面編程。
OOP:Object-Oriented Programming面向對象編程,封裝、繼承、多態。
常用術語:
AOP的使用:
- 導包
-
切入:新定義類,并 @Aspect總開關注解,切入點注解。
-
@Around:環繞通知是所有通知里功能最為強大的注解,可以實現前直通知、后直通知、異常通知以及返回通知的功能。
-
@Pointcut解釋:
@Pointcut("execution(* com.thinkstu.controller.*.*(..))")
-
三. SSM整合
? SSM整合指 Spring、SpringMVC、Mybatis的整合。
四. HttpServletRequest
說明
? 原生接口。當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對象中。
通過 HttpServletRequest我們可以獲得很多信息。
部分功能
-
headers:必須獲得全部的 key,而后才能遍歷出所有的 value。
-
getRemoteAddr:返回發出請求的客戶機的IP地址。
-
getParameter(“username”):獲取請求參數
提示:
獲取全部請求信息應該使用 RequestEntity,而不是HttpServletRequest。
單純簡單獲取請求體應該使用 @RequestHeader注解,而不是HttpServletRequest。
主要感覺 HttpServletRequest有點難用。
五. HttpServletResponse
? 原生方式控制返回,但是一般不這樣。
六. Cookie 與 Session
Cookie與 Session的區別:Session比Cookie安全
Cookie是客戶端技術,存儲在客戶端。Session是服務器端技術,存儲在服務端。
使用原因
? HTTP 是無狀態協議,它不能以狀態來區分和管理請求和響應,也就是說服務器單從網絡連接上無從知道客戶身份。于是我們可以給客戶端頒發通行證,如此服務端便能識別客戶的身份,這就是 Cookie的工作原理。
七. Cookie
? Cookie是服務器存儲在本地機器上的一小段文本。是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,并隨著每次請求發送到服務器。
? Cookie會根據響應報文里的一個叫做Set-Cookie的首部字段信息,通知客戶端保存Cookie。當下次客戶端再向服務端發起請求時,客戶端會自動在請求報文中加入Cookie值之后發送出去。然后服務器端會根據記錄,得到之前的最后狀態信息。
- logcookie = 3qjj:設置 Cookie的 key、value值。
- Expires:設置 cookie有效期,當省略 expires屬性時,Cookie在本次瀏覽器窗口關閉后失效。如果設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie依然有效直到超過設定的過期時間。
- Max-age:如果你創建了一個cookie,并將他發送到瀏覽器,默認情況下它是一個會話級別的cookie:存儲在瀏覽器的內存中,用戶退出瀏覽器之后被刪除。如果 你希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該 cookie。
- path:限制指定Cookie 的發送范圍的文件目錄,不過另有辦法可避開這項限制。
- domain:domain屬性指定一級域名。比如,指定 domain是 thinkstu.com,那么只有從一級域名是 thinkstu.com網址發送過來的請求才有效。
- secure:設置只有在HTTPS安全連接時,才可以發送Cookie。
- HttpOnly:使 JavaScript 腳本無法獲得 Cookie。通過上述設置,通常從 Web 頁面內還可以對Cookie 進行讀取操作,但使用 JavaScript 的 document.cookie無法讀取附加 HttpOnly 屬性后的Cookie 的內容。
Max-age與 Expires的區別
Expires和max-age都可以用來指定文檔的過期時間,但是二者有一些細微差別。
Expires表示絕對時間,HTTP 1.0開始使用。Max-age表示相對時間,HTTP 1.1開始使用。
限制情況
單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K。
八. Session
思想
? 當用戶第一次訪問網站時,網站會為用戶生成唯一的 Session ID值,而后 Session會自動跟隨響應報文 set-Cookie返回給客戶端,所以可以說 Session的設置在一定程度上依賴于 Cookie。可以把Session ID 想象成一種用以區分不同用戶的唯一Id。
強依賴 Cookie與弱依賴
? 當我們完全禁掉瀏覽器的cookie的時候,服務端的session可能不能正常使用。這取決于當前環境中 Session對 Cookie的依賴程度,通過規避寫法可以避免強依賴。比如當禁用 Cookie時,PHP會自動把Session ID附著在URL中,繼續正常使用。
九. 轉發與重定向
十. Spring項目轉SpringBoot
- 直接拷貝業務代碼、pom包(這里刪去Spring的依賴)
- 按 XML編寫配置類 或者直接導入配置類:@Import、@ImportSource
十一. Spring生命周期
這是一個大工程。
? 在 Spring中,由于其生命周期過于復雜,所以 Spring沒有按慣例為所有階段單獨定義方法。
? 其使用事件監聽器,我們只需要監聽被干預的階段即可(繼承接口實現)。
? 優點表現:統一了管理事件流程,并用泛型區分階段。
生命周期示意圖
CSDN鏈接
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3QSKrg0v-1651739102961)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1m6y2cq40j20u00ufq76.jpg)]
十二. 什么是 pom
- 項目依賴
- 插件
- 執行目標
- 項目構建 profile
- 項目版本
- 項目開發者列表
- 相關郵件列表信息
pom包細究:
? 總體結構(四部分),此為阿里云下載的 SpringBoot程序結構,官方與此稍有不同。
項目的總體信息
maven依賴庫
maven依賴庫設置
構建插件
十三. 為什么會返回JSON格式數據
- 使用了 @ResponseBody注解
- 導入了 Jackson JSON數據格式解析器
- 排除 Jackson依賴并導入其他依賴
- 配置新環境
(Spring官方對 fastJSON的支持度很低,自行配置編碼格式等內容)
@Configuration class MyFastJsonConfig {@BeanFastJsonHttpMessageConverter fastJsonHttpMessageConverter(){FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setCharset(Charset.forName("UTF-8"));config.setDateFormat("yyyy-MM-dd");config.setSerializerFeatures(SerializerFeature.WriteClassName,SerializerFeature.WriteMapNullValue,SerializerFeature.PrettyFormat,SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullStringAsEmpty);converter.setFastJsonConfig(config);return converter;} } server:port: 80servlet:encoding:force-response: true十四. 跨域請求 CORS
簡介:
? CORS,Cross-Origin Resource Sharing,是由 W3C制定的一種跨域資源共享技術標準,其目的是為了解決前端的跨域請求。它允許瀏覽器向跨源服務器,發出 XMLHttpRequest請求,從而克服了 AJAX只能同源使用的限制。
特征:
- 其特征是瀏覽器在發送請求時會攜帶 Origin標識,因為“ 跨域 ”。
- 服務器如果支持跨域請求,則會檢查 client所攜帶的 Origin正確性,作出相應回應。如果 oringin指定的域名在許可范圍內,服務器返回的相應數據則會多出幾個頭信息字段。
2?? Spring基礎知識
Spring全稱: Spring Framework
一. 注解開發說明
? Annotation:基于注解的方式 @Component。當我們給類注解時,默認 Bean的命名空間為小寫開頭的全類名,如 UserMapper則為 userMapper,當然我們也可以指定 Bean命名空間。
二. 配置 Bean
? 其實總的來說,配置 Bean的方式有很多種,在SpringBoot的學習過程中我知道起碼有七種。但是在日常的使用中普遍的也就兩種:@Component注解或者 @Bean注解。
說明
注解的方式需要事先開啟包掃描 @ComponentScan注解。
IDEA使用技巧
當顯示這個小圖標表示注解已生效,點擊可跳轉至 @Autowired被注入的地方。
注意:
當 Bean被創建時,會首先默認調用其無參構造方法。
當為餓漢模式時,運行即調用;當為懶漢模式時,使用時才調用。
SpringBoot如何設置在創建時調用有參構造方法?
@Configuration + @Bean
三. 配置第三方 Bean
? 采用配置類 @Configuration + @Bean的方式。第三個類可以指在所導入的 jar包中的類,它原來不是 Bean或者我們需要去配置它,但是我們并不能直接的去改寫它,因為繼承太過于麻煩、而且有時 jar中的類會被定義為 final無法繼承。
@Configuration public class CustomConfig {@BeanRedisTemplate getRedisTemplate(){return new RedisTemplate();} }四. 單例與多實例
? 當我們創建 Bean時,默認會為我們創建單例 Singleton的實例:即容器初始化時創建 Bean,容器關閉前銷毀 Bean。
? Spring默認類型是 singleton,幾乎90%以上的業務使用單實例就可以。
? Singleton的優點是效率高;缺點是可能會引發單線程下的線程安全問題。
? Prototype的優點是不會觸發單線程安全問題;缺點是每次連接請求都會創建 bean實例,請求數越多性能越低。而且因為創建的實例導致頻繁垃圾回收,GC的時長也相應增加。(garbage cycle)
多實例的創建:
五. @Autowired說明
? 自動注入本身屬性: require = true
? 實現功能:在注入時忽略報錯,有則加載、無則使用默認值。
// 此處并不一定會加載 222,而是該 Bean不存在時才會加載 222,注意這種寫法。 @Autowired(required = false) User user = new User(222);| @Autowired | 根據屬性類型自動裝配 |
| @Qualifier | 結合@ Autowired根據屬性名稱自動裝配 |
| @Resource | 可以根據屬性類型或屬性名稱進行注入 |
| @Value | 普通類型屬性注入 |
(但是 Spring官方不推薦使用 @Resource,因為注解并非 Spring官方開發,而是屬于 Javax——Java擴展包之中的內容)
簡單使用:
? 配置同類型不同名的 Bean對象。
@Configuration public class CustomConfig {@Bean@Primary // 默認 BeanUserService get_01() {return new UserServiceImpl();}@Bean("other") // 需指定名稱才能導入UserService get_02() {return new UserServiceImpl();} }? 利用 @Autowired + @Qualifier 進行指定Bean的注入。
@Autowired @Qualifier("other") UserService service;六. Bean的生命周期
? Bean也含有生命周期,利用注解(于方法上)我們可以對其進行控制,分別在其創建后、銷毀前。
? @PostConstruct與 @PreDestroy
@PostConstructvoid initial(){System.out.println("創建后"); }@PreDestroy void destroy(){System.out.println("銷毀前"); }七. 條件裝配:Bean加載控制
? 即 @Conditional(OnSmtpEnvCondition.class)的形式。
? 使用條件注解,使我們能夠更加靈活的裝載 Bean。
- @Conditional注解可以放在方法和類上。
- 放在方法上和 @Bean一起使用,表示如果 @Conditional注解的參數類 matches方法為true這創建這個 Bean實例,否則不創建。
- 放在類上結合 @Configuration、@ComponentScan判斷被注解的類是否需要創建
- 可以同時擁有多個 @Conditional,變式多樣。
( 比如 @ConditionalOnMissingClass(com.pojo.yyoo) ,當不存在此類時,條件為真。)
八. 為Bean內的變量賦值
? Spring在注入一對象時,對象里的變量是如何被賦值的呢?
? Spring會調用這些變量的 set___ ( ) 方法從而為這些變量賦值,我們可以控制此流程。
九. Spring事務管理
十. JdbcTemplate解釋
十一. P命名空間
? 即存在于 XML配置文件中的擴展寫法(了解即可)。
實現步驟:
復制標準格式,改成名稱 P。
直接使用
十二. 關閉ApplicationContext
? 利用ApplicationContext獲取的對象,最后需要手動的去關閉它。
兩種方法:
十三. 完全注解開發
十四. 獲取 Bean
? Spring中擁有兩種方式(并非方法)。
按 ID名字獲取
在SpringBoot中,根據 @Autowired + @Qulifier 獲取
按類型獲取
十五. 導入其他配置項
? 兩種注解。
十六. Bean的分類
JavaBean分為兩類:
- 一類稱為實體類 Bean:專門存儲業務數據的,如 Student、User 等
- 一類稱為業務類 Bean:指 Service 或 Dao 對象,專門用于處理業務邏輯和數據訪問。
3?? Spring MVC基礎知識
一. MVC簡介
二. 衍生的 Bean注解
? 這些衍生出來的注解都是同一種東西的不同表現形式,作用完全一樣、只是為了給程序員作區分使用。
| Component | 一般組件 |
| Controller | 控制器 |
| Service | 事件處理器 |
| Repository | 持久層處理器 |
三. 路徑疊加
四. RESTful風格
全稱:Representational State Transfer,表現形態轉換。
分類(Spring共支持8種)
GET(查詢)、POST(新增、保存)、PUT(修改)、DELETE(刪除)
說明:
- 當使用 RESTful風格時,就無路徑參數符號 ? 拼接參數。
- 當然,RESTful風格只是一種規范,流行于前后端分離開發。
路徑占位符
| 訪問首頁 | / | GET |
| 查詢全部數據 | /employee | GET |
| 刪除 | /employee/2 | DELETE |
| 跳轉到添加數據頁面 | /toAdd | GET |
| 執行保存 | /employee | POST |
| 跳轉到更新數據頁面 | /employee/2 | GET |
| 執行更新 | /employee | PUT |
五. @RequestMapping詳解
? 該注解屬性有六種,分別為 value、method、produces、consumes、header、params。
? 其中注意 headers作用的是請求頭,而 params作用的則是請求參數。
value
指定請求的實際地址。
method
指定請求的method類型, GET、POST、PUT、DELETE等。
produces
指定返回內容的類型,只有當 request請求頭中 Accept屬性包含該 produces指定的類型才能返回數據成功,例如:accept:text/xml。
cousumes
指定request請求提交的內容類型(Content-Type),例如application/json, text/html等。
headers
指定request請求中必須包含某些指定的請求頭header的值,才能讓該方法處理請求。
例如:Host=127.0.0.1
“header”:要求請求映射所匹配的請求必須攜帶header請求頭信息
“!header”:要求請求映射所匹配的請求必須不能攜帶header請求頭信息
“header=value”:要求請求映射所匹配的請求必須攜帶header請求頭信息且header=value
“header!=value”:要求請求映射所匹配的請求必須攜帶header請求頭信息且header!=value
params
指定request請求地址中必須包含某些參數值,方法才處理,否則拒絕處理。
----params = “key1”==:表示請求必須包含名為key1的請求參數;
----params = “!key1”:表示請求不能包含名為key1的請求參數;
----params = “key1 != value1”:表示請求必須包含名為key1的請求參數,但是其值不能是value1;
----params = {“key1 = value1”, “key2”}:==表示請求必須包含名為key1和key2兩個請求參數,且key1的值必須為value1;
六. 路徑 ant風格
? SpringMVC支持 ant風格的路徑,即支持 ant風格的通配符,三種。
| ? | 單個字符 |
| * | 0個或多個字符 |
| ** | 一層或者多層目錄 |
七. 非 RESTful風格說明
? 本節將展示當我們不采用 RESTful風格時的情況。
一般使用(參數同名時)
形參參數名應與瀏覽器傳過來的參數名一樣,并不使用 @PathVariable路徑參數注解。
在該例中,瀏覽器會跳轉至 /static/uuu.html頁面(MVC自動解析跳轉)。
可變長參數
最后環節,使用數組接收可變長參數。
@RequestParam參數
當形參參數名與瀏覽器傳過來的參數不一致時,使用注解來指定。
required:是否必須
name:名字
defaultValue:當不存在時,則使用默認值。(結合 required = false 使用)
八. 域共享對象
實例:在 url的跳轉中實現數據的共享。
要求:既要實現完整功能,又要范圍最小。
5種方式
- 原生 Servlet:request.setAttribute( key , value ) + EL表達式。
- ModelAndView
- ModelMap
- HttpSession對象
- Application對象
九. ModelAndView
說明
ModelAndView 統一實現了 Model對象和 View對象的功能。
Model 主要用于向請求域共享數據,其本身是 Map的子類,擁有相應功能。
View 主要用于設置視圖實現頁面跳轉。
注意
? 當未配置其他解析器或者為使用 @ResponseBody注解時,默認使用的是SpringMVC解析器,而SpringMVC解析器會返回 ModelAndView對象。
實現原理
? 當控制器處理完請求后,通常控制器會將包含視圖名稱以及一些模型屬性的 ModelAndView對象返回給 DispatcherServlet。因此,在控制器中會構造一個 ModelAndView對象
數據共享:直接使用方法。
十. 請求響應擴展
簡介
正式名稱:HttpMessageConverter 報文信息轉換器。
將請求報文轉換為Java對象,或將Java對象轉換為響應報文。
四種類型:
@RequestBody
? 該注解加在Controller 的處理方法的形參上,作用是將json格式的數據轉為java對象。
? 作用于 Post請求,獲取請求體。
@RequestBody String requestBody @RequestBody User user_dateRequestEntity對象
? 獲取的是整個請求頭+請求體,getBody( ) 獲取請求體,getHeaders( )獲取請求頭。
? **需要理解的是,HttpServletRequest是 Servlet技術,而 RequestEntity是 SpringMVC技術。**使用 RequestEntity而不使用 HttpServletRequest。
用法:只要控制器方法的形參中設置該類型,其就會自動賦值。
public String test(RequestEntity reqEntity){// }@ResponseBody
? 該注解使用在Controller 方法上的 。將方法的返回值通過適當的轉換器(如 Jackson)轉換為指定的格式之后,寫入到 response 對象的 body 區,通常用來給客戶端返回 JSON 數據或者是 XML 數據。
? 當方法上面沒有寫 ResponseBody 時,底層會將方法的返回值封裝為 ModelAndView 對象(原此);需要注意的是,在使用此注解之后不會再走試圖處理器,而是直接將數據寫入到輸入流中,他的效果等同于通過 response 對象輸出指定格式的數據。
ResponseEntity對象
? 可以定義返回的 HttpStatus(狀態碼)和 HttpHeaders(響應頭) 和響應體 body,當形參出現此時,ModelAndView失效、@ResponseBody注解也失效。
@RequestMapping("/downExcel") @ResponseBody public String downExcel(HttpServletResponse response) {// response邏輯操作OutputStream os = response.getOutputStream();return "" }十一. MVC工作流程
? 用戶通過視圖層發送請求到服務器,在服務器中請求被Controller接收,Controller調用相應的Model層處理請求,處理完畢將結果返回到Controller,Controller再根據請求處理的結果找到相應的View視圖,渲染數據后最終響應給瀏覽器。
十二. 文件下載
- 先通過輸入流( 例如InputStream )將文件讀取到Java程序中。
- 建立 byte[ ] 數組,將輸入流讀取到的所有數據都存儲到byte [ ] 數組。
- 向客戶端響應byte[ ]數組或者類似 **ResponseEntity<byte[ ]>**的響應類型。
實踐:
? 以上代碼我在 IDEA與服務器上并未跑通,于是我嘗試了別的方法。
? 需要說明的是:所有資源都放在/resource/static/里。
- IDEA跑通,服務器跑通。
-
IDEA跑通,服務器未跑通。
在路徑兩處多了感嘆號 ! ,暫時不明白原因是什么。
十三. 文件上傳
本質:文件復制。
上傳功能必需請求頭:
multipart/form-data,即標明為以二進制方式上傳數據,而不是key-value。
簡單實踐
該案例會將文件上傳至與當前項目總文件夾 平齊的文件夾。
十四. 攔截、過濾、分發器總結
英文名稱
- 攔截器 interceptor:攔截Controller,分為前后攔截器。
- 過濾器 Filter
- 分發器 DispatcherServlet
示意圖:
十五. @RequestParam、@PathVariable區別
? @RequestParam,@PathVariable 之間的區別。
? @RequestParam 和 @PathVariable 注解都是用于從 request中接收請求,兩個都可以接收參數。關鍵點不同的是 @RequestParam 是從request里面拿取值,而 @PathVariable 是從一個 URI模板里面來填充。
- 用@RequestParam:/login?name=uu&pass=123
- defaultValue 如果本次請求沒有攜帶這個參數,或者參數為空,那么就會啟用默認值
- name 綁定本次參數的名稱,要跟URL上面的一樣
- required 這個參數是不是必須的
- value 跟name一樣的作用,是name屬性的一個別名**(震驚)**
- 用@PathVariable:/login/uu/123
- name-要綁定到的路徑變量的名稱
- required-指示路徑變量是否為必需
- value 跟name一樣的作用,是name屬性的一個別名
十六. 視圖解析器
簡介:
SpringMVC視圖的種類很多,默認有轉發視圖和重定向視圖。
但這必須不能存在@ResponseBody注解。
存在@ResponseBody注解時,就關乎SpringBoot下頁面的跳轉問題,具體使用 ModelAndView。
關注點:Themleaf好像已經很少使用。
轉發視圖
? SpringMVC中默認的轉發視圖是 InternalResourceView。
? 當控制器方法中所設置的視圖名稱以"forward:"為前綴時,會創建InternalResourceView視圖,此時的視圖名稱不會被SpringMVC配置文件中所配置的視圖解析器解析,而是會將前綴"forward:"去掉,剩余部分作為最終路徑通過轉發的方式實現跳轉
重定向視圖
? SpringMVC中默認的重定向視圖是 RedirectView。
? 當控制器方法中所設置的視圖名稱以"redirect:"為前綴時,創建RedirectView視圖,此時的視圖名稱不會被SpringMVC配置文件中所配置的視圖解析器解析,而是會將前綴"redirect:"去掉,剩余部分作為最終路徑通過重定向的方式實現跳轉
十七. SpringMVC執行流程
**前置知識:**SpringMVC常用組件
- DispatcherServlet:前端控制器,不需要工程師開發,由框架提供
作用:統一處理請求和響應,整個流程控制的中心,由它調用其它組件處理用戶的請求
- HandlerMapping:處理器映射器,不需要工程師開發,由框架提供
作用:根據請求的url、method等信息查找Handler,即控制器方法
- Handler:處理器,需要工程師開發
作用:在DispatcherServlet的控制下Handler對具體的用戶請求進行處理
- HandlerAdapter:處理器適配器,不需要工程師開發,由框架提供
作用:通過HandlerAdapter對處理器(控制器方法)進行執行
- ViewResolver:視圖解析器,不需要工程師開發,由框架提供
作用:進行視圖解析,得到相應的視圖,例如:ThymeleafView、InternalResourceView、RedirectView
- View:視圖
作用:將模型數據通過頁面展示給用戶
SpringMVC的執行流程:
DispatcherServlet對請求 URL進行解析,得到請求資源標識符 URI,判斷請求 URI對應的映射:
不存在
-
判斷是否配置了mvc:default-servlet-handler
沒配置:則控制臺報映射查找不到,客戶端展示404錯誤
有配置:則訪問目標資源(一般為靜態資源,如:JS,CSS,HTML),找不到客戶端也會展示404錯誤
存在(此處的 Handler為 Controller的同一對象不同說法)
-
根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最后以 HandlerExecutionChain執行鏈對象的形式返回。
-
DispatcherServlet 根據獲得的 Handler,選擇一個合適的 HandlerAdapter。
-
如果成功獲得 HandlerAdapter,此時將開始執行攔截器的 preHandler(…)方法【正向】
-
提取 Request中的模型數據,填充Handler入參,開始執行 Handler方法,處理請求。在填充 Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
a) HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息
b) 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
c) 數據格式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
d) 數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
Handler執行完成后,向DispatcherServlet 返回一個ModelAndView對象。
此時將開始執行攔截器的postHandle(…)方法【逆向】。
根據返回的ModelAndView(此時會判斷是否存在異常:如果存在異常,則執行HandlerExceptionResolver進行異常處理)選擇一個適合的ViewResolver進行視圖解析,根據Model和View,來渲染視圖。
渲染視圖完畢執行攔截器的afterCompletion(…)方法【逆向】。
將渲染結果返回給客戶端。
十八. Thymeleaf說明
簡介:
- 在目前的企級應用開發中前后端分離是趨勢,但視圖層技術仍有一席之地。
- Spring Boot 官方推薦使用的模板引擎是 Thymeleaf,Spring Boot 提供了 Thymeleaf自動配置解決方案,因而Spring Boot 中使用 Thymeleaf非常方便。
- 如果開發者使用的是前后端分離技術,那么開發過程不需要整合視圖層技術。
默認配置說明
路徑:classpath/template/____,后綴 html。
實現步驟:
- 導pom start包
- yml配置屬性
- controller中使用
實現說明:
在 cotroller中使用后,會默認返回 ModelAndView對象。
SpringMVC返回的也是 ModelAndView對象,兩者同為視圖解析器。
4?? SpringBoot小知識點
**static與 template目錄:**static中的資源不受保護,可以直接通過 url定位來訪問,而templates中的資源是受保護的。
SpringBoot工程在IDEA下需要聯網進行。
SpringBoot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化Spring應用的初始搭建以及開發過程。
SpringBoot只是簡化Spring與SpringMVC的簡化開發,MybatisPlus也是在簡化Mybatis,本質還是SSM框架。
Spring Boot 不支持同時在配置中啟動 HTTP HTTPS 。
一些專業名詞
- 數據源:DruidDataSource
- 持久化技術:Mybatis、MybatisPlus
- 數據庫:MySQL
三種內嵌的數據源
數據源默認存在的,并不一定需要 Druid。
三種內嵌數據庫(了解)
不過到真正上線的時候還是要切換到正式數據庫,而且體驗并不是很好,棄用。
MyBatis是一個基于 Java的、封裝了 JDBC的持久層框架,其底層使用 JDBC來編寫。
JS等前端庫可通過 pom導入。
<dependency><groupId>org.webjars</groupId><artifactId>vue</artifactId><version>2.6.14</version> </dependency>Controller路徑命名規則:
常用復數形式表示,如 users、employees等。
配置文件放在哪?
在Maven的結構下,配置文件均放在resource目錄里。
yml配置信息如何記?
未知編程思想
當遇到陌生方法調用時,只需觀察其形參與返回值,在大多數情況下便可了解其用法。
html表單說明
html中的 form表單只能發送 Get或者 Post請求,并不能發送其他請求。
Tomcat思想:萬物皆對象。
JSON數據格式說明:一共只有兩種格式。
寶塔小坑
- 阿里云與寶塔均存在端口攔截機制,需要在兩邊都打開才能訪問。
- 即使我在寶塔里部署 SpringBoot項目時設置了隨機端口映射,寶塔也不會默認開啟端口。
關于 long類型
5?? SpringBoot基礎知識
一. 初始項目結構
├── HELP.md ├── README.md ├── catcat.iml ├── mvnw ├── mvnw.cmd ├── pom.xml └── src├── main│ ├── java│ │ └── com│ │ └── thinkstu│ │ └── catcat│ │ └── CatcatApplication.java│ └── resources│ ├── application.properties│ ├── static│ └── templates└── test└── java└── com└── thinkstu└── catcat└── CatcatApplicationTests.java二. delete、put請求說明
? 部分瀏覽器只支持發送 get和 post請求,那么在 SpringBoot中該如何發送 put和 delete請求呢?
? SpringMVC 提供了 HiddenHttpMethodFilter 幫助我們將 POST 請求轉換為 DELETE 或 PUT 請求,SpringBoot中默認存在此配置類。
使用要求:
- 瀏覽器的請求方式必須為post
- 瀏覽器必須傳輸請求參數_method
? 滿足以上條件,HiddenHttpMethodFilter 過濾器就會將當前請求的請求方式轉換為請求參數_method的值,因此請求參數_method的值才是最終的請求方式。
三. jar包與 war包的區別
簡介:
? jar包和war包都可以看成壓縮文件,都可以用解壓軟件打開,jar包和war包都是為了項目的部署和發布,通常在打包部署的時候,會在里面加上部署的相關信息。
簡單區別:
- JAR(Java Archive,Java 歸檔文件),是一個完整的項目結構,以流行的 ZIP 文件格式為基礎,jar包本質上就是 zip包,只是額外附加了一些固定的描述文件。
- war包不是一個完整的項目結構,需要按照傳統的方式去進行部署。war包是 Sun提出的一種 web應用程序格式,與 jar類似,是很多文件的壓縮包。
根本區別:
? JAR文件的目的是把類和相關的資源封裝到壓縮的歸檔文件中,而對于WAR文件來說,一個WAR文件代表了一個Web應用程序,它可以包含 Servlet、HTML頁面、Java類、圖像文件,以及組成Web應用程序的其他資源,而不僅僅是類的歸檔文件。
四. start 與 parent的區別
五. @SpringBootApplication說明
簡介:
位于主啟動程序上,負責配置主程序。
其實是一個 SpringBoot Configuration( SpringBoot Configuration下面是 @Configuration)。
六. #{ }與 ${ }說明
簡介:
- #{ }用來獲取 Bean類的變量值。
- ${ }用來獲取 yml文件中的變量值。
范例:
加載名為users的這個Bean的cycle屬性值
七. @ControllerAdvice說明
? @ControllerAdvice :全局數據處理,是@Controller 的加強版。
? @ControllerAdvice 主要用來處理全局數據,一般搭配@ExceptionHandler、@ModelAttribute 及@InitBinder 使用。而RESTControllerAdvice就是Restful風格的ControllerAdvice;
八. 臨時配置說明
有時我們會為了安全,禁止其他人在運行我們的程序時添加臨時屬性。
方式:阻止main主程序中的args參數傳到SpringApplication。
九. yml格式說明
-
屬性 與 屬性值之間用冒號 : 分隔,屬性值之前要加空格
-
大小寫敏感,禁止同名,#表注釋。
-
多屬性值(數組)之間用**小橫桿-**分隔
-
使用縮進表示層級關系,同層級左側對齊,只允許使用空格。
-
屬性值支持轉義字符,但必須用雙引號括起來。如:name: "/t name /n"
表示獲取該程序的version屬性,@ @包裹、輸入會有提示。
十. 松散綁定說明
簡介:
松散綁定是 Spring為了兼容各種編程愛好者而制定的規則。
我們并不需要使用,但是要了解、知道它的存在,其有時會導致程序出現 error。
注意點:
- 部分支持、部分不支持,使用駝峰命名法永遠沒有錯。
- @ConfigurationProperties支持松散綁定,@Value不支持。
范例:
? yml中寫的是 dataSource,但是在代碼中以下形式都能綁定上數據。
@ConfigurationProperties(prefix = "datasource") @ConfigurationProperties(prefix = "Data_Source") @ConfigurationProperties(prefix = "Data-Source") // 羊肉串模式 //等等6?? SpringBoot常用操作
一. 頁面跳轉
? 在 SpringBoot條件下,利用 ModelAndView實現。
二. 注解方式獲取請求頭
@RequestHeader,Spring中常用方式,非原生的方式。
經過觀察,其注解的參數與 @RequestParam一樣。
三. 注解方式獲取Cookie
@CookieValue,Spring中常用方式,非原生的方式。
@CookieValue注解一共有三個屬性:value、required、defaultValue,用法同@RequestParam
四. 編碼格式修改
? SpringBoot默認的編碼格式是 UTF-8 (寫在底層源碼中)。
有三種方式可以定制編碼格式。
yml配置
直接查找 endoding就可以顯現所有的內容。
Filter 過濾器配置
原理:Filter是瀏覽器發送的請求接觸到的第一層服務器端應用。 (代碼省略)
五. 發送郵件
三個郵件協議
- SMTP:simple mail transfer protocol 簡單郵件傳輸協議,發送郵件
- POP3:post office protocol -Version 3 第3代郵局協議,接受郵件
- IMAP:Internet mail access protocol 互聯網消息協議,用來替代IMAP,接受郵件
POP3與IMAP的不同點:**首先要得知,**我在這里所說的采用郵件協議為,全部在第三方軟件中采用。采用POP3時,郵件刪除等操作不會同步,即使你在第三方郵件系統刪除了某封郵件,但是在原郵件系統中并不會執行刪除操作。而采用IMAP就是為了改進這一點,實現了同步的操作。
簡單實現三步走:
- 導包:spring-boot-starter-mail。
- 配置信息(服務器host、賬號、授權碼等)
- 代碼實現(自動注入JavaMailSender類)
范例:
發送簡單郵件
? **發送復雜郵件:**html格式、附件等
- 將 SimpleMailMessage替換成 MimeMessage
- 借助于 MimeMessageHelper創建郵件內容
郵件中的SSL加密
? 發送郵件或者接受郵件時我們可以配置SSL加密,具體要去郵件提供商那邊獲取。
? 例如對于騰訊,SSL端口為465或者587,首先開啟 SSL然后再配置端口。
六. Scheduled定時任務
- 啟動類上開啟
- 方法上調用
七. Cron格式編寫指南
簡介:
- 邏輯反人類
- 在線驗證網站:鏈接
簡單編寫思想
調整的時間順序,思維應該順著從小到大
編寫規則
秒數:
- 范圍 0~59 ,不允許為空值,若值不合法,調度器將拋出 SchedulerException異常
- ***** 表每隔1秒鐘觸發;
- , 表在指定的秒數觸發,比如"0,15,45"代表0秒、15秒和45秒時觸發任務
- - 表在指定范圍內觸發,比如"25-45"代表從25秒開始觸發到45秒結束觸發,每隔1秒觸發1次
- / 表觸發步進(step),**"/“前面的值代表初始值(”“等同"0”),后面的值代表偏移量。**比如"0/20"或者"/20"代表從0秒鐘開始,每隔20秒鐘觸發1次,即0秒觸發1次,20秒觸發1次,40秒觸發1次;"5/20"代表5秒觸發1次,25秒觸發1次,45秒觸發1次;"10-45/20"代表在[10,45]內步進20秒命中的時間點觸發,即10秒觸發1次,30秒觸發1次。
純數字系列:
基于系統時間,比如 5即代表當系統時間走到某分鐘05秒時觸發。
每分鐘0秒觸發格式為 0 * * * * ? 或者 0 0/1 * * * ? 。
最后的問號代表什么:
其實最后一位代表星期幾。為避免與前面沖突,故使用 ? 來表示任意。
八. SpringBootAdmin監控
簡介:
分布式監控程序,非 SpringBoot官方開發,使用時需導入與之對應的官方版本號,否則報錯。
注意事項:
子節點要開放什么內容全部由子節點規定,Server無權干涉。(安全性)
實現流程:
-
導包 admin + SpringBoot Web
-
yml配置主從客戶端
配置Server,主程序上開啟 @EnableAdminServer注解, yml中配置端口。
配置Client,yml中配置主服務器即可。
簡單實現
配置 Server:
配置 Client:
界面預覽
打開 Server主頁地址,可以看到許多的數據
info信息配置
- info端點:在 Server中展示 client業務信息的端點,比如程序名、作者,初始值為空。
- 上述配置的另一種實現方案:創建 Bean并繼承 InfoContributor 后編寫配置。
自定義Health健康狀況
? 比如 client程序中存在 Redis,那么就會顯示redis的健康狀況。
四種狀態:
? up在線、down離線、unkown未知、outofservice失去服務。
? 我們可以利用四種狀態在編碼中寫一些自定義程序,然后為這些程序添加 health監控。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yX3TLkw1-1651739102964)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1o6xhkv8sj21xs0u0tcc.jpg)]
@Component public class HealthConfig extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Health.Builder builder){boolean check=true;if (check){builder.withDetail("runtime","xxx");builder.status(Status.UP);}else{builder.withDetail("error","系統運行失敗");builder.status(Status.DOWN);}} }結合郵件系統:郵件信息報警系統
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MBjnpfJ6-1651739102964)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1o6xhb71xj21cm0man1y.jpg)]
九. 消息中間件
- MQ:Message Queue,消息隊列。
- JMS:Java Message Service;一個規范,等同于JDBC,提供了與消息服務相關的API接口
- AMQP: advanced message queue protocal,高級消息傳輸協議,一種協議,不一定要遵守。其解決了JMS中的數據格式不唯一的缺點,統一使用byte[ ]。
- Kafka:大數據技術,可以用作消息中間件,但是主要功能不是此。其是一種高吞吐量的分布式發布訂閱消息系統,提供實時消息功能。
-
JMS消息模型
- Peer-to-peer:P2P,點對點模型,一對一。
- publish-subscribe:發布訂閱模型,消息可以被多個消費者消費,生產者與消費者完全獨立,不需要告知對方自身的存在。
-
JMS消息種類
TextMessage、MapMessage、ByteMessage、StreamMessage、ObjectMessage、Message
-
實現JMS的技術
ActiveMQ、Redis、RabbitMQ、RocketMQ(沒有完全實現)
-
優點:
具有跨平臺性,服務器、供應商、生產者消費者可以使用不同的語言來實現。
-
AMQP消息模型:
direct exchange、fanout exchange、topic exchange、headers exchange、system exchange
-
AMQP消息種類:byte[ ]
-
AMQP實現:
RabbitMQ、RockerMQ、StormMQ等
四種消息中間件簡介
ActiveMQ:Apache產品,社區已經不活躍。
RabbitMQ:使用頻率較高,速度中等,數據直接寫在磁盤中,不易丟失。
RocketMQ:阿里巴巴開源的消息中間件,Java語言開發,各方面也表現的比較優越,幾乎同時解決了Kafka和RabbitMQ它們兩個的缺點,速度介于兩者之間,數據不易丟失。
Kafka:速度快,但數據寫在內存中、易丟失。
實現暫略。
十. 自定義錯誤頁
簡介:
- Spring Boot 中的錯誤默認由 BasicErrorController 類來處理
- 如果開發者不需要向用戶展示詳細的錯誤信息,那么可以把錯誤信息定義成靜態頁面。
- 在resources/static 中創建 error目錄,然后導入錯誤展示頁面。
原理:
? 當觸發錯誤頁面時,BasicErrorController類被調用。(其將會返回 JSON或 html格式的錯誤數據,具體由用戶請求方式而定)
- JSON格式的 error得到解決,html格式的 error傳到下一步。
- 觸發 DefaultErrorViewResolver類,開始在 error目錄查找 4__ 、5__格式的錯誤頁面。
- **(還是找不到時觸發)**回到 errorHtml ( )方法,使用 error 作為默認的錯誤頁面視圖名,如果名 error的視圖也找不到,就會展示默認錯誤頁面。
獲取錯誤的靜態頁面,置于 /resource/static/error 目錄中。
-
兩種形式:
xx形式 與 具體的數字形式。4xx.html、5xx.html的優先級低于具體的數字權限,如404、503等,所以它們是可以同時的存在的。
十一. Slf4j日志使用
簡介:
- Lombok包中提供的注解。
- 針對類使用、打印類的日志。
- 在開發中,應該盡量使用日志而不是打印 Print。
簡單實現:
- 注解實現
- 原生創建
**從左至右:**日志記錄時間、級別、PID、所屬線程、類對象、信息。
十二. 靜態資源訪問
簡介
- 在SpringMVC 中,對于所有的靜態資源都需要開發者手動配置資源過濾
- Spring Boot簡化了靜態資源過濾配置
- SpringBoot靜態資源自動化配置類: WebMvcAuto Configuration。
位置說明
SpringBoot默認會過濾所有的靜態資源,一共有5個位置。
開發者可以將靜態資源放在這5個位置中的任意一個,優先級依次降低。
? 如果將文件夾中存在同名文件,則只有第一個會生效。
十三. 路徑映射
簡介
? 正常情況,如果我們有靜態網頁會放在/static里,然后訪問的時候需要添加 .html后綴。如果不想添加.html后綴,則需要在 Controller中加一層轉發的操作。
? 但是我們有更簡單的方法,而且節省資源。
效果:
訪問 http://localhost/aaa
相當于 http://localhost/aaa.html
簡單實現:
首先將文件置于/static下。
? 然后編寫 @Configuration、配置 WebMvcConfigurer接口,實現跳轉。
@Configuration public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/uuu").setViewName("/uuu.html");registry.addViewController("/ooo").setViewName("/ooo.html");} }十四. 服務器日志
簡介:
在服務器中使用日志。
在正式業務上線后不能使用開發工具進行調試,我們需要日志系統。
說明:
保存到服務器上的日志數據,我們可以使用 IDEA打開(擁有格式)。
簡單使用
十五. 多環境開發 Profile
簡介:
SpringBoot約定在不同環境下配置文件的名稱規則為
- application-{profile} .properties
- application-{profile}.yml
profile占位符表示當前環境的名稱。
作用:
解決在多環境開發下配置文件混亂的問題。
版本限制說明:
- SpringBoot 2.4之前是 include
- SpringBoot 2.4之后是 group
- 阿里云現在的是2.3.7版本
簡單實現
- 在主 yml配置文件以外,編寫多份 yml文件
- application-dev
- application-devDB
- application-MVC
- 在主 yml配置文件中選擇性的引入其他配置文件。
十六. 優先執行的代碼
簡介:
? 有一些特殊任務需要在系統啟動時執行(例如配置文件加載、數據庫初始化等),SpringBoot對此提供了兩種基本一樣的方案:CommandLineRunner類、ApplicationRunner類。
兩種簡單實現:
? CommandLineRunner:Spring Boot 項目在啟動時會遍歷所有 CommandLineRunner的實現類,并調用其中的 run 方法,如果整個系統中有多個 CommandLineRunner 的實現類,那么可以使用 @Order注解對這些實現類的調用順序進行排序。Order值越小越優先執行,可為負數,負數最小。
? ApplicationRunner:幾乎同上。兩者 Order通用,計算執行順序的時候需要同時參考兩者。
@Component @Order(-1000) public class Start03 implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("33333");} }十七. 異常處理器
簡介:
異常,指的是當正常訪問時服務器時發生的異常,并非指 404之類的異常。
簡單實現
( utils包下的異常處理類)
十八. 配置日志等級
簡介:
在 yml中配置當前日志的打印等級,一共有兩種形式。
- 按包名劃分
- 按分組劃分
簡單實現:
按包名劃分
logging:level:root: error # root是根路徑 / 的正式寫法com.test.controller: info分組劃分,先分組再劃定等級。
logging:group:ebank_name: com.test.controller,com.test.mapperlevel:root: errorebank: info十九. 兼容xml配置文件
簡介:
? 有時候我們需要改寫一些比較老的程序,或者作 xml文件配置。
? 雖然 SpringBoot不推薦使用 xml進行配置,但是如果開發者需要使用 xml配置,那么只需在 resources目錄下提供配置文件、然后在主程序上導入即可。
說明:
- @ImportResource:導入 XML配置文件。
- @Import:導入其他配置類。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yWRboVy5-1651739102965)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1sq40ejyaj214a0aoabn.jpg)]
二十. 讀取標準 yml配置
簡介:
? yml 中編寫了眾多屬性,那么該入伙獲取呢?
獲取方式分類:
- 單個讀取
- 全部讀取
- 選擇讀取
單個讀取:@Value注解
選擇讀取:既可以為 Spring原生 Bean注入屬性,也可以為第三方 Bean注入屬性。
實現步驟:
-
yml存在數據
-
創建屬性獲取 Bean( @Component + @Data + @ConfigurationProperties 注解)。
在這一步 Spring可能會提示缺少相應包,按提示導入即可。
-
注入該 Bean并使用
二十一. 讀取第三方 yml配置
簡介:
? 我懷疑此種方式存在Bug,單級可以識別,一旦遇到多級就不能識別我的文件。還應該注意的是,方法不止這一種,但這種比較直接。
簡單實現:
@PropertySource屬性引入第三方文件(得加上類全路徑名)
二十二. 攔截器
? 所有的攔截器都必須實現 HandlerInterceptor接口。
? **攔截器( Interceptor)**同 Filter 過濾器一樣,都是面向切面編程 AOP 的具體實現。
必須實現的三個方法。
- preHandle:控制器方法執行之前執行 preHandle(),其 boolean類型的返回值表示是否攔截或放行,返回 true為放行,即調用控制器方法;返回 false表示攔截,即不調用控制器方法。當它返回 false 時,表示請求結束,
- postHandle: 方法在當前請求處理完成之后,也就是 Controller 方法調用之后執行。但是它會在 DispatcherServlet 進行視圖返回渲染之前被調用,我們可以在這個方法中對 Controller 處理之后的 ModelAndView 對象進行操作。
- afterComplation:該方法在整個請求結束之后,也就是在 DispatcherServlet 渲染了對應的視圖之后執行,主要用來進行資源清理。
- 執行順序:preHandle ----> Controller ----> postHandle ----> afterComplation
多個攔截器的執行順序
- 攔截器的執行順序為鏈條。
- ==注意:==當某個攔截器方法返回值為 false時,后續的 Interceptor和 Controller都不會再執行,所以一般需要手寫為 true。
實現步驟:
- 繼承自 HandlerInterceptor,重寫方法
- @Configuration中 注冊攔截器:將攔截器 Bean交由 SpringMVC攔截器類 WebMvcConfigurer管理。
在這一步才能配置攔截的路徑,還可以配置排除的路徑 excludePathPatterns。
二十三. 頁面跳轉
原理:利用 ModelAndView對象。
@GetMapping ModelAndView get() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("/uuu.html");return modelAndView; }7?? SpringBoot常用技巧
一. 獲取UUID的正確姿勢
二. 全路徑名
? 在 xml或者 yml文件中進行配置時,可以使用全路徑名縮寫形式:classpath:
classpath:UserMapper.class # 相當于全路徑+UserMapper.class三. 頁面重定向
? 簡單的頁面重定向,頁面跳轉與重定向并不一樣。
@GetMapping() String getById(HttpServletResponse response) throws IOException {response.sendRedirect("/cancel.html");return null; }四. 表格的畫法
我是實在想不到,竟然還會有表格畫法這種教程。
節點用+號碼表示,線條用-號表示,空格表示表中的待填項。
System.out.println("+----+--------+"); System.out.println("+ | |"); System.out.println("+ | |"); System.out.println("+----+--------+");五. yml中相互引用
? dollar + 大括號
username: kkyour_name: ${username}六. 隨時獲取 ApplicationContext
為什么能夠實現?
? 理解 SpringBoot底層工作源碼,采取官方接口 ___Aware。
簡單實現:
只要繼承 ApplicationContextAware并實現 set方法即可。
public class Demo01 implements ApplicationContextAware {ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;} }七. 網站圖標 favicon
簡介
favicon,網站圖標。
雖然在 html代碼中也可以添加,不過在此添加較為方便。
簡單實現
- 將普通圖片轉為 ico圖標文件,鏈接
- 重命名為 favicon.ico ,置于 /resource/static/ 下。
八. 跳過測試模塊
問題簡介:
SpringBoot程序在打包的時候會默認先執行測試類 Test里面的方法。
這是因為存在 Maven生命周期,后執行的必須先執行前面的所有內容。
解決:maven設置跳過測試
九. 排除自動配置
簡介:
手動排除 SpringBoot的自動配置。
兩種實現方法:
- 主程序上配置
- yml中配置
十. 查看 pom組件版本
簡介:
查看在 pom文件中導入的具體軟件版本(全部)。
可以分為兩種,Spring官方 與 阿里云鏡像 所創建的 SpringBoot程序并不一樣。
Spring官方
兩層點擊:spring-boot-starter-parent — spring-boot-dependencies
阿里云
在 dependencyManagement下的與中,點擊查看。
十一. 正確的項目創建流程
簡介:
有利于項目與項目之間的解耦合,促進開發。
操作流程:
- 創建空項目工程
- 在空的項目工程中 添加 所需要的其他組件 module。
十二. 離線創建SpringBoot程序
簡介:
在沒有網絡的計算機上創建 SpringBoot程序,過程離線。
但事先需要在官網上把相應文件創建并下載。
步驟:
- 官網創建、下載
- 將項目導入離線設備
十三. 快速制作程序模板
簡介:
制作模板程序,可以在學習的過程中大量復制某份程序。
制作模板步驟:
-
選擇模板
-
刪除項目結構的無用文件
-
刪除pom文件兩行、改一行(結束)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bh5Q4N9S-1651739102967)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1p9wf9t2xj2144092q53.jpg)]
使用步驟:
通常都是在項目中直接將上面的模板當成組件module導入。
- 再復制出一份模板。
- 在pom文件中把改成新組件名。
- IDEA中導入,注意此次選擇的是import module而不是new module。
- 設置使用的JDK版本。(結束)
十四. Tomcat替換成Jetty
簡介:
排除 Tomcat依賴,可以換成其他任意服務器程序。
步驟:
- pom中排除 Tomcat依賴
- pom中新增 Jetty依賴
十五. 修改Banner
簡介:
修改控制臺打印出來的 Banner廣告位。
兩種方法:
-
純文字:/resource 中編寫 banner.txt文件,Banner在線生成網站
-
文字或者圖片:yml中配置
十六. 測試中開啟服務器配置
簡介:
? 我們在執行測試的時候,SpringBoot默認不開啟服務器、節省資源。但是現在由于業務需求,需要對其測試,采用 WebEnvironment Web環境。
webEnviroment參數說明:
十七. 測試中開啟事務
簡介:
? 在測試中經常會有寫入數據庫操作,但我只想知道是否執行成功,不想污染數據庫。
步驟:
- SpringBoot程序中已經導入 mysql + mybatis的包,沒有則無法開啟事務
- 開啟 @Transational 注解
十八. 測試中的臨時屬性
簡介:
? 想要在測試用例中添加一些臨時屬性,在 @SpringBootTest 中使用參數屬性注入即可。
十九. @JsonIgnore
簡介:
? 使用 Jackson作為項目的序列化工具時,可以作用在屬性、方法或者類上面,用來規避不想要的序列化功能。
二十. 項目打包構建
簡介:
? 我們在 SpringBoot項目中能夠打包是因為配置了 maven插件,該插件由 SpringBoot parent 中提供。但是其他公司可能不采用 SpringBoot parent 作為parent,此時就需要配置。
示意圖:避免重復打包
二十一. IDEA隱藏文件
簡介:
隱藏不想看見的文件,避免冗余。
set up — Edit — File Type.
注意事項
在 IDEA 2022.01版本中,我遭遇了隱藏文件時產生的 Bug,需注意。
二十二. jdk8單位類
簡介:
? JDK8 提供了兩個單位類,用來規范單位的表達形式。
分別為:
- 時間單位:Duration
- 容量大小單位:DataSize
8?? SpringBoot不常用操作
1. 修改配置文件名
修改配置文件名,然后在程序運行時再指定配置文件名
雖然感覺這種方式比較愚蠢,但是暫時收錄
2. maven控制yml環境
maven是比 Spring更底層的存在,Spring建立在 maven的基礎之上。
我們可以使用 maven來控制并改變 Spring運行的時的 yml文件配置。
3. JDBC使用
優勢闡述:
? Mybatis之類是基于JDBC開發的,可以說 jdbc是更加底層的存在。
? 安全性與底層效率要較其他框架高,銀行相關行業比較熱衷此。
步驟:
4. 熱部署
說明:
- 只能夠在開發環境中使用,并不是生產環境,也就是只能在 IDEA中使用
- 部署比直接運行run速度要快,因為部署是 restart而不是 reload整個工程。
- 消耗的資源很多,不實用,謹慎開啟。
開啟流程:到pom包、idea設置中開啟。
5. 開啟 Bean校驗
6. 代碼中編寫測試
有時候我們需要在代碼中編寫測試用例,而不使用 postman這類工具。
? get請求訪問頁面,先開啟webEnviroment、AutoConfigureMockMVC,然后注入MOckMVC,最后執行操作
7. 測試用例中設置隨機數據
只是想在測試的時候加載一些隨機數據,應該把以下內容用Profile思想來編寫:即多份yml文件。
9?? 整合第三方
此章節需要日積月累。
一. 整合Mybatis
二. 整合MybatisPlus
三. 整合Druid
🔟 Spring Security
一門登錄技術, 學會不易。
一. 簡介
Spring Security是基于內存級別的認證,不是數據庫。
SpringBoot為 SpringSecurity提供了很好的支持。
導包之后,SpringSecurity為我們提供了一個默認頁面登錄頁面(未登錄時攔截了所有的請求!),默認賬號為user,密碼見控制臺。如果對初始的賬號密碼不滿意,可以在yml中修改。
spring:security:user:name: adminpassword: adminroles: ADMIN #此處是區分大小寫的,需特別注意二. 使用步驟
導包
yml簡單配置
代碼中正式配置
配置說明:
-
訪問/admin/** 需要 ADMIN角色權限
-
訪問/user/ ** 需要 CAT或者 USER角色權限。
-
訪問其他任意資源都要先登錄。
-
默認登錄頁面是 /login。
-
permitAll作用于 /login ,表示和登錄相關的接口都不需要認證即可訪問。
-
csrf( ).disable( )表示關閉 csrf,防止服務器被 csrf攻擊。
(csrf攻擊:Cross Site Request Forgery,跨站請求偽造。)
三. 自定義登錄頁面與返回值
簡介:
? 目前為止我們使用的還都是 Spring Security默認提供的登錄頁面。
? 在前后端分離的開發中,我們需要自定義登錄頁面與返回的 JSON格式數據
思想:
- 雖然新登錄地址是/login_new,但是最終的數據提交地址還是/login。
- 對于傳輸過程中的參數 usename與 password可以自定義而不必固定。
- 可以設置登錄成功、失敗返回的數據。
簡單實現(配置):
四. 注銷登錄
簡介:
? 默認訪問 /logout即可注銷。
? 但是在這里我遇到問題,可能是這種方式已經失效。
五. 加鹽 Salt
簡介:
? 所謂加鹽就是一種加密形式,其既可以是隨機數、也可以是用戶名。
? 加鹽之后原本密碼相同的用戶所生成的最終密碼也不會相同,可以有效防止跑庫破解密碼。
傳統加鹽方式:需要在數據庫中記錄用戶的鹽值。
Spring Security加鹽:
? Spring Security提供了多種加鹽方案。
? 官方推薦使用BCryptPasswordEncoder,其使用了 BCrypt 強哈希函數,開發者在使用時可以選擇提供 strength 和 SecureRandom 實例 ,strengh越大,密鑰的迭代次數越多,迭代次數為2的strength次方。(strength 取值在4~31 之間,默認為 10)
@Configuration public class PasswordEncoderConfig {@BeanPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder(10);} }簡單使用:
- 寫 service
- 注冊時將 encrypt傳到數據庫(代碼編寫)
六. 使用注解進行配置
簡介:
? 上面都是使用 Java類來進行Spring Security配置,現在采用注解的形式。
? 配置內容:訪問路徑(或者方法)需要授權。
使用步驟:
- 開啟注解形式
- 類或者方法上面使用
七. 持久層存儲:數據庫
簡介:
? 將 Spring Security基于內存級別的登錄驗證信息存儲到數據庫。
遺憾:暫時未能成功實現。
實現步驟:
- 創建數據庫對應表:首先得創建三張數據庫用戶表
- 代碼中實現注冊與登錄等相關業務
建表語句范例:
八. 令牌技術:token
簡介:
? 本節基于 OAuth2框架,該框架的使用與實現賬號密碼登錄不沖突。
遺憾:暫時未能成功實現。
令牌技術說明:
? 令牌技術的優勢在于可以只授權部分權限給第三方,從而避免了密碼直接泄露的可能性。第三方拿著令牌可以訪問一些基礎資源,如:頭像、用戶名等。很多第三方也只支持 token而不支持 Cookie(如:微信小程序)。
交互流程(三次):
OAuth授權模式說明:
? OAuth具有多種授權模式,其各有千秋、按需選擇。
九. WebSocket
十. Swagger2
簡介:
? 一種可以將 代碼編寫 和 需求文檔編寫 融為一體的技術(暫時無該需要)。
簡單實現
總結
以上是生活随笔為你收集整理的SpringBoot笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 7常见蓝屏代码解决办法
- 下一篇: vue2.0 如何自定义组件(vue组件