后端 | SSM框架 | Spring
筆記來(lái)源:黑馬程序員SSM框架教程_Spring+SpringMVC+Maven高級(jí)+SpringBoot+MyBatisPlus企業(yè)實(shí)用開(kāi)發(fā)技術(shù)
一、核心概念
代碼書寫現(xiàn)狀:耦合度高。
解決方案:使用對(duì)象時(shí),在程序中不要主動(dòng)new產(chǎn)生對(duì)象,轉(zhuǎn)換為由外部提供對(duì)象。
1、IOC(Inversion Of Control)控制反轉(zhuǎn)
對(duì)象的創(chuàng)建控制權(quán)由程序轉(zhuǎn)移到外部,這種思想稱為控制反轉(zhuǎn)。
Spring技術(shù)對(duì)IOC思想的實(shí)現(xiàn):
Spring提供了一個(gè)容器,稱為IOC容器,用來(lái)充當(dāng)IOC思想中的“外部”。
IOC容器負(fù)責(zé)對(duì)象的創(chuàng)建、初始化等一系列工作,被創(chuàng)建或被管理的對(duì)象在IOC容器中統(tǒng)稱為Bean。
2、DI(Dependency Injection)依賴注入
在容器中建立bean與bean之間的依賴關(guān)系的整個(gè)過(guò)程,稱為依賴注入。
二、IOC入門
導(dǎo)入Spring坐標(biāo):
定義Spring管理的類(接口):
創(chuàng)建Spring配置文件,配置對(duì)應(yīng)類作為Spring管理的bean:
初始化IOC容器(Spring核心容器/Spring容器),通過(guò)容器獲取bean:
三、DI入門
1、依賴注入方式
setter注入——引用類型、簡(jiǎn)單類型:
刪除使用new的形式創(chuàng)建對(duì)象的代碼,在bean中定義引用類型、簡(jiǎn)單類型屬性并提供可訪問(wèn)的set方法。
配置中使用property標(biāo)簽ref屬性注入引用類型對(duì)象、value屬性注入簡(jiǎn)單類型數(shù)據(jù)。
構(gòu)造器注入——引用類型、簡(jiǎn)單類型:
在bean中定義引用類型、簡(jiǎn)單類型屬性,并提供可訪問(wèn)的構(gòu)造方法。
配置中使用constructor-arg標(biāo)簽注入引用類型對(duì)象、簡(jiǎn)單類型數(shù)據(jù)。
2、依賴注入方式選擇
強(qiáng)制依賴使用構(gòu)造器進(jìn)行,使用setter注入有概率不進(jìn)行注入導(dǎo)致null對(duì)象出現(xiàn)。
可選依賴使用setter注入進(jìn)行,靈活性強(qiáng)。
Spring容器倡導(dǎo)使用構(gòu)造器,第三方框架內(nèi)部大多數(shù)采用構(gòu)造器注入的形式進(jìn)行數(shù)據(jù)初始化,相對(duì)嚴(yán)謹(jǐn)。
如果有必要可以兩者同時(shí)使用,使用構(gòu)造器注入完成強(qiáng)制依賴的注入,使用setter注入完成可選依賴的注入。
實(shí)際開(kāi)發(fā)過(guò)程中還要根據(jù)實(shí)際情況分析,如果受控對(duì)象沒(méi)有提供setter方法就必須使用構(gòu)造器注入。
自己開(kāi)發(fā)的模塊推薦使用setter注入。
四、bean
1、bean的基礎(chǔ)配置
bean別名配置:使用name屬性,可定義多個(gè),多個(gè)之間使用逗號(hào)、分號(hào)和空格分隔。
bean作用范圍配置:使用scope屬性,可選值為singleton(默認(rèn)值,單例)、prototype(非單例)。
2、bean的實(shí)例化
構(gòu)造方法(常用):提供可訪問(wèn)的構(gòu)造方法。
靜態(tài)工廠:
實(shí)例工廠:
FactoryBean:
3、bean的生命周期
生命周期:
初始化容器:創(chuàng)建對(duì)象(內(nèi)存分配)、執(zhí)行構(gòu)造方法、執(zhí)行屬性注入(set操作)、執(zhí)行bean初始化方法。
使用bean:執(zhí)行業(yè)務(wù)操作。
關(guān)閉/銷毀容器:執(zhí)行bean銷毀方法。
生命周期控制:
提供生命周期控制方法:
配置生命周期控制方法:
接口控制:
銷毀時(shí)機(jī):
容器關(guān)閉前觸發(fā)bean的銷毀。
關(guān)閉容器方式:
手工關(guān)閉容器:ConfigurableApplicationContext接口close()操作。
注冊(cè)關(guān)閉鉤子,在虛擬機(jī)退出前先關(guān)閉容器再退出虛擬機(jī),ConfigurableApplicationContext接口registerShutdownHook()操作。
4、依賴自動(dòng)裝配
IOC容器根據(jù)bean所依賴的資源在容器中自動(dòng)查找并注入到bean的過(guò)程中稱為自動(dòng)裝配。
自動(dòng)裝配方式:配置中使用bean標(biāo)簽autowire屬性設(shè)置自動(dòng)裝配的類型
按類型(常用)
按名稱
按構(gòu)造方法
不啟用自動(dòng)裝配
自動(dòng)裝配特征:
自動(dòng)裝配用于引用類型依賴注入,不能對(duì)簡(jiǎn)單類型進(jìn)行操作。
使用按類型裝配時(shí)(byType)必須保障容器中相同類型的bean唯一,推薦使用。
使用按名稱裝配時(shí)(byName)必須保障容器中具有指定名稱的bean,因變量名和配置耦合,不推薦使用。
自動(dòng)裝配優(yōu)先級(jí)低于setter注入和構(gòu)造器注入,同時(shí)出現(xiàn)時(shí)自動(dòng)裝配配置失效。
五、集合注入
數(shù)組、List、Set、Map、Properties
六、加載properties文件
開(kāi)啟context命名空間
使用context命名空間,加載指定properties文件
使用${}讀取加載的屬性值
其他
不加載系統(tǒng)屬性
加載多個(gè)properties文件
加載所有properties文件
加載properties文件標(biāo)準(zhǔn)格式
從類路徑或jar包中搜索并加載properties文件
七、容器
1、創(chuàng)建容器
類路徑加載配置文件
文件路徑加載配置文件
加載多個(gè)配置文件
2、獲取bean
使用bean名稱獲取
使用bean名稱獲取并指定類型
使用bean類型獲取
八、注解開(kāi)發(fā)
1、注解開(kāi)發(fā)定義bean
使用@Component定義bean
核心配置文件中通過(guò)組件掃描加載bean
Spring提供@Component注解的三個(gè)衍生注解:
@Controller:用于表現(xiàn)層bean定義
@Service:用于業(yè)務(wù)層bean定義
@Respository:用于數(shù)據(jù)層bean定義
2、純注解開(kāi)發(fā)模式
Spring3.0開(kāi)啟了純注解開(kāi)發(fā)模式,使用Java類替代配置文件,開(kāi)啟了Spring快速開(kāi)發(fā)賽道。
Java類代替Spring核心配置文件。
@Configuration注解用于設(shè)置當(dāng)前類為配置類。
@ComponentScan注解用于設(shè)定掃描路徑,此注解只能添加一次,多個(gè)數(shù)據(jù)請(qǐng)用數(shù)組格式。
讀取Spring核心配置文件初始化容器對(duì)象切換為讀取Java配置類初始化容器對(duì)象。
3、bean管理
作用范圍:使用@Scope定義bean作用范圍。
生命周期:使用@PostConstruct、@PreDestory定義bean生命周期。
4、依賴注入
使用@Autowired注解開(kāi)啟自動(dòng)裝配模式(按類型)。
注意:
自動(dòng)裝配基于反射設(shè)計(jì)創(chuàng)建對(duì)象并暴力反射對(duì)應(yīng)屬性為私有屬性初始化數(shù)據(jù),因此無(wú)需提供setter方法。
自動(dòng)裝配建議使用無(wú)參構(gòu)造方法創(chuàng)建對(duì)象(默認(rèn)),如果不提供對(duì)應(yīng)構(gòu)造方法,請(qǐng)?zhí)峁┪ㄒ坏臉?gòu)造方法。
使用@Qualifier注解開(kāi)啟指定名稱裝配bean。
注意:
@Qualifier注解無(wú)法單獨(dú)使用,必須配合@Autowired注解使用。
使用@Value實(shí)現(xiàn)簡(jiǎn)單類型注入。
注意:
路徑僅支持單一文件配置,多文件使用數(shù)組格式配置,不允許使用通配符*。
5、第三方bean管理
使用@Bean配置第三方bean。
使用獨(dú)立的配置類管理第三方bean。
導(dǎo)入式:獨(dú)立的配置類不加@Configuration,使用@Import注解導(dǎo)入獨(dú)立的配置類,@Import注解只能寫一次,如果要導(dǎo)入多個(gè)獨(dú)立配置類,以數(shù)組形式導(dǎo)入。
掃描式:獨(dú)立的配置類加@Configuration,使用@ComponentScan注解掃描配置類所在的包,加載對(duì)應(yīng)的配置類信息。
6、第三方bean依賴注入
簡(jiǎn)單類型依賴注入:
引用類型依賴注入:
引用類型注入只需要為bean提供方法設(shè)置形參即可,容器會(huì)根據(jù)類型自動(dòng)裝配對(duì)象。
九、AOP
1、AOP簡(jiǎn)介
AOP(Aspect Oriented Programming)面向切面編程,一種編程范式,指導(dǎo)開(kāi)發(fā)者如何組織程序結(jié)構(gòu)。
作用:在不驚動(dòng)原始設(shè)計(jì)的基礎(chǔ)上為其進(jìn)行功能增強(qiáng)。
AOP核心概念
連接點(diǎn)(JoinPoint):程序執(zhí)行過(guò)程中的任意位置,粒度為執(zhí)行方法、拋出異常、設(shè)置變量等。在SpringAOP中,理解為方法的執(zhí)行。
切入點(diǎn)(PointCut):匹配連接點(diǎn)的式子。在SpringAOP中,一個(gè)切入點(diǎn)可以只描述一個(gè)具體方法,也可以匹配多個(gè)方法。
通知(Advice):在切入點(diǎn)處執(zhí)行的操作,也就是共性能力。在SpringAOP中,功能最終以方法的形式呈現(xiàn)。
通知類:定義通知的類。
切面(Aspect):描述通知與切入點(diǎn)的對(duì)應(yīng)關(guān)系。

2、AOP入門案例
導(dǎo)入AOP相關(guān)坐標(biāo)
定義dao接口與實(shí)現(xiàn)類
定義通知類,制作通知
定義切入點(diǎn)(切入點(diǎn)依托一個(gè)不具有實(shí)際意義的方法進(jìn)行,即無(wú)參數(shù),無(wú)返回值,方法體無(wú)實(shí)際邏輯)
綁定切入點(diǎn)與通知關(guān)系,并指定通知添加到原始連接點(diǎn)的具體執(zhí)行位置
定義通知類受Spring容器管理,并定義當(dāng)前類為切面類
開(kāi)啟Spring對(duì)AOP注解驅(qū)動(dòng)支持
3、AOP工作流程
Spring容器啟動(dòng)
讀取所有切面配置中(使用的)的切入點(diǎn)
初始化bean,判定bean對(duì)應(yīng)的類中的方法是否匹配到任意切入點(diǎn)
匹配失敗,創(chuàng)建對(duì)象。
匹配成功,創(chuàng)建原始對(duì)象(目標(biāo)對(duì)象)的代理對(duì)象。
獲取bean執(zhí)行方法
獲取bean,調(diào)用方法并執(zhí)行,完成操作。
獲取的bean是代理對(duì)象時(shí),根據(jù)代理對(duì)象的運(yùn)行模式運(yùn)行原始方法與增強(qiáng)的內(nèi)容,完成操作。
AOP核心概念:
目標(biāo)對(duì)象(Target):原始功能去掉共性功能對(duì)應(yīng)的類產(chǎn)生的對(duì)象,這種對(duì)象是無(wú)法直接完成最終工作的。
代理(Proxy):目標(biāo)對(duì)象無(wú)法直接完成工作,需要對(duì)其進(jìn)行功能回填,通過(guò)原始對(duì)象的代理對(duì)象實(shí)現(xiàn)。
4、AOP切入點(diǎn)表達(dá)式
切入點(diǎn):要進(jìn)行增強(qiáng)的方法。
切入點(diǎn)表達(dá)式:要進(jìn)行增強(qiáng)的方法的描述方式。
切入點(diǎn)表達(dá)式標(biāo)準(zhǔn)格式:動(dòng)作關(guān)鍵詞(訪問(wèn)修飾符 返回值 包名.類/接口名.方法名(參數(shù))異常名)
可以使用通配符描述切入點(diǎn),快速描述
*:?jiǎn)蝹€(gè)獨(dú)立的任意符號(hào),可以獨(dú)立出現(xiàn),也可以作為前綴或者后綴的匹配符出現(xiàn)。
..:多個(gè)連續(xù)的任意符號(hào),可以獨(dú)立出現(xiàn),常用于簡(jiǎn)化包名與參數(shù)的書寫。
+:專用于匹配子類類型。
5、AOP通知類型
AOP通知描述了抽取的共性功能,根據(jù)共性功能抽取的位置不同,最終運(yùn)行代碼時(shí)要將其加入到合理的位置。
AOP通知分類:
前置通知:@Before
后置通知:@After
環(huán)繞通知:@Around
環(huán)繞通知必須依賴形參ProceedingJoinPoint才能實(shí)現(xiàn)對(duì)原始方法的調(diào)用,進(jìn)而實(shí)現(xiàn)原始方法調(diào)用前后添加通知。
通知中如果未使用ProceedingJoinPoint對(duì)原始方法進(jìn)行調(diào)用將跳過(guò)原始方法的執(zhí)行。
對(duì)原始方法的調(diào)用可以不接收返回值,通知方法設(shè)置成void即可,如果接收返回值,必須設(shè)定為Object類型。
原始方法的返回值如果是void類型,通知方法的返回值類型可以設(shè)置為void,也可以設(shè)置為Object。
由于無(wú)法預(yù)知原始方法運(yùn)行后是否會(huì)拋出異常,因此環(huán)繞通知方法必須拋出Throwable對(duì)象。
返回后通知:@AfterReturning
拋出異常后通知:@AfterThrowing
6、AOP通知獲取數(shù)據(jù)
獲取切入點(diǎn)方法的參數(shù)
JoinPoint:適用于前置、后置、返回后、拋出異常后通知
ProceedJoinPoint:適用于環(huán)繞通知
獲取切入點(diǎn)方法的返回值
返回后通知
環(huán)繞通知
獲取切入點(diǎn)方法的異常
拋出異常后通知
環(huán)繞通知
十、Spring事務(wù)
1、Spring事務(wù)簡(jiǎn)介
事務(wù)作用:在數(shù)據(jù)層保障一系列的數(shù)據(jù)庫(kù)操作同成功同失敗。
Spring事務(wù)作用:在數(shù)據(jù)層或業(yè)務(wù)層保障一系列的數(shù)據(jù)庫(kù)操作同成功同失敗。
2、Spring事務(wù)角色
事務(wù)管理員:發(fā)起事務(wù)方,在Spring中通常指代業(yè)務(wù)層開(kāi)始事務(wù)的方法。
事務(wù)協(xié)調(diào)員:加入事務(wù)方,在Spring中通常指代數(shù)據(jù)層方法,也可以是業(yè)務(wù)層方法。
3、Spring事務(wù)配置屬性
readOnly:設(shè)置是否為只讀事務(wù)。
timeout:設(shè)置事務(wù)超時(shí)時(shí)間,timeout=-1表示永不超時(shí)。
rollbackFor:設(shè)置事務(wù)回滾異常(class)。
rollbackForClassName:設(shè)置事務(wù)回滾異常(String)。
noRollbackFor:設(shè)置事務(wù)不回滾異常(class)。
noRollbackForClassName:設(shè)置事務(wù)不回滾異常(String)。
propagation:設(shè)置事務(wù)傳播行為。
REQUIRED(默認(rèn)):事務(wù)管理員有事務(wù),事務(wù)協(xié)調(diào)員就加入;事務(wù)管理員無(wú)事務(wù),事務(wù)協(xié)調(diào)員就新建事務(wù)。
REQUIRED_NEW:事務(wù)管理員有無(wú)事務(wù),事務(wù)協(xié)調(diào)員都新建事務(wù)。
SUPPORTS:事務(wù)管理員有事務(wù),事務(wù)協(xié)調(diào)員就加入;事務(wù)管理員無(wú)事務(wù),事務(wù)協(xié)調(diào)員也無(wú)事務(wù)。
NOT_SUPPORTED:事務(wù)管理員有無(wú)事務(wù),事務(wù)協(xié)調(diào)員都無(wú)事務(wù)。
MANDATORY:事務(wù)管理員有事務(wù),事務(wù)協(xié)調(diào)員就加入;事務(wù)管理員無(wú)事務(wù),事務(wù)協(xié)調(diào)員就報(bào)錯(cuò)。
NEVER:事務(wù)管理員有事務(wù),事務(wù)協(xié)調(diào)員就報(bào)錯(cuò);事務(wù)管理員無(wú)事務(wù),事務(wù)協(xié)調(diào)員也無(wú)事務(wù)。
NESTED:設(shè)置savePoint,一旦事務(wù)回滾,事務(wù)將回滾到savePoint處,交由客戶響應(yīng)提交/回滾。