Spring5基礎
基於Spring 5.2.6 版本。
Spring概念

IOC容器

IOC底層原理的演進過程——本質就是為了高內聚,低耦合
在原始方式中,我們通過new創建對象來實現創建對象的邏輯,但是這樣做當對象路徑等發生變化時,就要修改程式碼,耦合度太高。
因此,我們引入了工廠模式來降低耦合,這樣當我們的類發生變化要進行修改時,可以不改動調用類,而是去修改工廠類,這樣就降低了耦合度。但是這樣子耦合度就來到了工廠類身上。

Spring在工廠類中以配置文件加反射的方式來進一步降低耦合度,當類發生變化時,我們只需要修改配置文件而不需要去修改程式碼,進一步降低了耦合度,這就是IOC的本質就是一個對象工廠。
即:IOC容器 = 工廠模式 + xml解析(註解)+ 反射

Spring IOC容器相關實現類

IOC進行Bean管理
概念


基於xml方式進行bean管理
set方法注入屬性


有參構造函數注入屬性


p名稱空間注入——為了簡化set方法注入的寫法,不建議使用

xml注入其他類型屬性
注入null值和xml的特殊符號
字面量:指設置屬性的固定值
]]> ,在mybatis的xml中的sql語句常用。

注入外部bean屬性——工作中最常用方式

注入內部bean屬性
如果一個bean要復用,寫在外部,如果偶爾使用甚至是一次性的,用注入內部bean屬性方式比較好。


級聯賦值注入bean屬性——建議還是用注入外部bean屬性的方式




xml注入集合屬性
在集合裡面設置普通類型值



在集合裡面設置對象類型值

提取集合作為公共部分用於注入復用


FactoryBean——工廠bean


bean的作用域



還有其他作用域(一般不使用):
request:表示bean對象在一次請求中生效。
session:表示bean對象在一次會話中生效。
bean的生命周期——重要
生命周期時指從對象創建到對象銷毀的過程。



程式碼


xml自動裝配
自動裝配要求我們只要把bean實例創建出來,在bean配置上使用autowire屬性值指定自動裝配規則,Spring就會自動幫我們注入屬性值。
手動裝配就是我們自己在xml中配置property屬性值。


xml讀取外部屬性文件——讀取properties等配文件的配置
以配置德魯伊資料庫連接池為例。




基於註解方式進行bean管理




屬性注入方式註解有3種
分別是@Autowired、@Qualifier、@Resource。





AOP
AOP基於動態代理實現,常見使用場景如:
- 全局出入參日誌的列印
- 事務
- 全局異常的捕獲處理
- 鑒權
AOP基本原理



JDK動態代理


程式碼示例




AOP術語


AspectJ基本概念和準備

切入點表達式(重點)


基於註解實現AspectJ——重點






抽取共同切入點寫法



基於XML配置文件實現AspectJ

JDBCTemplate——相當於JDBC的封裝版——了解



增

刪

改

查
查詢某個值——count


查詢對象

查詢對象列表

批量操作



事務管理

事務介紹


註解聲明式事務管理


聲明式事務參數配置






XML聲明式事務管理



完全註解聲明式事務管理——即使用配置類替換XML配置


Spring5新特性
整合slf4j2日誌框架

1、引入依賴
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.2</version>
</dependency>
</dependencies>
2、創建配置文件——log4j2.xml
約定:配置名是固定的,放在項目resources根目錄下,否則不會生效,只會走默認沒有配置下的日誌列印配置。
<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先順序排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status用於設置log4j2自身內部的資訊輸出,可以不設置,當設置成trace時,可以看到log4j2內部各種詳細輸出-->
<configuration status="DEBUG">
<!--先定義所有的appender-->
<appenders>
<!--輸出日誌資訊到控制台-->
<console name="Console" target="SYSTEM_OUT">
<!--控制日誌輸出的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</console>
</appenders>
<!--然後定義logger,只有定義了logger並引入的appender,appender才會生效-->
<!--root:用於指定項目的根日誌,如果沒有單獨指定Logger,則會使用root作為默認的日誌輸出-->
<loggers>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>

@Nullable註解

Lambda表達式創建Spring容器對象

Spring5支援整合JUnit5——單元測試必備——重點



重點使用@SpringJUnitConfig複合註解來進行單元測試

SpringWebflux
核心是:基於reactor的響應式編程和基於java8的函數式編程。
gateway基於webflux來實現,普通的服務基於springmvc實現,像網關這種需要處理更多的請求的場景用webflux來非同步非阻塞處理請求更加方便,可以在有限的資源中處理更多的請求。
響應式編程類似於電子表格中的計算,就是觀察者模式。
同步與非同步,阻塞與非阻塞
拿等公交車舉例:你在公交車站等公交車,你是調用者,你在等公交車時就是等著,不幹其他的,就是同步,你在等車時順便聽聽歌,看看新聞,就叫非同步;而公交車在收到你等待它的消息時,公交車是被調用者,如果他馬上回應你,等車到站了才告訴你我車到了,叫做阻塞,而如果公交車馬上回應你,說我還有3分鐘到站,就是非阻塞。













基於註解編程模型








基於函數式編程模型






Spring5重點掌握點總結





