【SSM面向CRUD编程专栏 7】springAop 事务控制
🛫更多ssm知識(shí)見SSM_面向CRUD編程專欄
🚕本博客總結(jié)自黑馬程序員的ssm框架視頻
🚒博主對(duì)于該知識(shí)尚在學(xué)習(xí)階段
🚄如果發(fā)現(xiàn)存在問題請(qǐng)毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客主頁(yè)🚀🚀
目錄
1 Spring AOP
2 使用AOP開發(fā)
3 spring的事務(wù)控制
1 Spring AOP
????????AOP(Aspect Oriented Programming)意思是面向切面編程,是通過預(yù)編譯的方式和運(yùn)行期間動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP(面向?qū)ο缶幊?的延續(xù),是函數(shù)式編程的一種衍生范型,利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯個(gè)部分之間的耦合性降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。
????????AOP可以在程序運(yùn)行期間,在不修改源碼的情況下對(duì)方法進(jìn)行功能的增強(qiáng)。它的優(yōu)勢(shì)就是可以減少重復(fù)代碼,提高開發(fā)效率,并且便于維護(hù)。
底層實(shí)現(xiàn)
????????AOP的底層通過Spring提供的動(dòng)態(tài)代理技術(shù)實(shí)現(xiàn),在運(yùn)行期間,Spring通過動(dòng)態(tài)代理技術(shù)動(dòng)態(tài)的生成代理對(duì)象,代理對(duì)象方法執(zhí)行時(shí)進(jìn)行增強(qiáng)功能的介入,再去調(diào)用目標(biāo)對(duì)象的方法,從而完成功能的增強(qiáng)。
相關(guān)名詞概念
- Target(目標(biāo)對(duì)象):也就是被代理類對(duì)象
- Proxy(代理):一個(gè)類被AOP增強(qiáng)后return的對(duì)象就是代理類對(duì)象
- JoinPoint(連接點(diǎn)):每個(gè)被攔截到的方法就是一個(gè)連接點(diǎn),這里點(diǎn)指的是方法,因?yàn)閟pring只支持方法類型的連接點(diǎn)
- Pointcut(切入點(diǎn)):需要被增強(qiáng)的每個(gè)方法就是一個(gè)切入點(diǎn)
- Advice(增強(qiáng)):用于定義功能增強(qiáng)方法
- Aspect(切面):切入點(diǎn)加增強(qiáng)就是切面
- Weaving(織入):將切入點(diǎn)的方法進(jìn)行增強(qiáng)的過程就被稱為織入,spring采用動(dòng)態(tài)代理織入,而AspectJ采用編譯器織入和類裝載期織入。
常用的兩種動(dòng)態(tài)代理技術(shù)
- JDK代理:基于接口的動(dòng)態(tài)代理技術(shù),有接口時(shí)使用
- cglib代理:基于父類的動(dòng)態(tài)代理技術(shù),無(wú)接口時(shí)使用
JDK代理
第一步:創(chuàng)建一個(gè)公共接口
?第二步:創(chuàng)建一個(gè)被代理類實(shí)現(xiàn)公共接口
?第三步:創(chuàng)建一個(gè)功能增強(qiáng)類
?第四步:測(cè)試類,利用反射創(chuàng)建代理類調(diào)用增強(qiáng)方法
測(cè)試結(jié)果:
cglib代理
第一步:導(dǎo)入相應(yīng)的依賴jar包
? ? ? ? 由下圖可知,cglib的包已經(jīng)被封裝到spring-core中它又被封裝在spring-context中,故只需要導(dǎo)入spring-context的依賴就可以使用cglib
?第二步:創(chuàng)建一個(gè)被代理類
第三步:創(chuàng)建一個(gè)功能增強(qiáng)類
第四步:測(cè)試類,利用反射創(chuàng)建代理類調(diào)用增強(qiáng)方法
?測(cè)試結(jié)果:
2 使用AOP開發(fā)
? ? ? ? AOP開發(fā)需要編寫目標(biāo)類的目標(biāo)方法、編寫切面類內(nèi)置功能增強(qiáng)方法、配置配置文件將切入點(diǎn)與增強(qiáng)方法相結(jié)合。spring框架會(huì)監(jiān)控切入點(diǎn)方法的執(zhí)行,一旦監(jiān)控到切入點(diǎn)方法執(zhí)行就會(huì)動(dòng)態(tài)的使用代理機(jī)制創(chuàng)建代理類對(duì)象,并在相應(yīng)位置將增強(qiáng)與切入點(diǎn)進(jìn)行織入。spring框架會(huì)根據(jù)目標(biāo)類是否實(shí)現(xiàn)了接口來決定使用JDK和cglib中的哪一種動(dòng)態(tài)代理模式
基于xml的AOP開發(fā)
第一步:導(dǎo)入相關(guān)依賴
?第二步:創(chuàng)建一個(gè)公共接口和目標(biāo)類
?第三步:創(chuàng)建一個(gè)切面類內(nèi)置增強(qiáng)方法
第四步:配置配置文件(創(chuàng)建對(duì)象的bean標(biāo)簽、配置織入關(guān)系)
測(cè)試類及結(jié)果:
? ? ?
?? 通知類型
? ?
?? ?切點(diǎn)表達(dá)式的寫法:
🔴訪問修飾符可以省略不寫🔴返回值類型、方法全限名里的具體項(xiàng)可以使用*代表任意🔴包名與類名之間一個(gè)點(diǎn).代表當(dāng)前包下的類,兩個(gè)點(diǎn)..代表當(dāng)前包及其子包下的類🔴參數(shù)可以使用兩個(gè)點(diǎn)..代表任意(任意個(gè)數(shù)、任意類型)
舉例如下:對(duì)照上述要求理解記憶
?? 切點(diǎn)表達(dá)式的抽取??
??
?? 環(huán)繞式增強(qiáng)方法
? ??
? ??
基于注解的AOP開發(fā)
第一步:導(dǎo)入相關(guān)依賴
第二步:創(chuàng)建一個(gè)公共接口和目標(biāo)類
第三步:創(chuàng)建一個(gè)切面類內(nèi)置增強(qiáng)方法
第四步:配置配置文件(開啟組件掃描、AOP自動(dòng)代理)
?測(cè)試類:
3 spring的事務(wù)控制
編程式事務(wù)控制三個(gè)對(duì)象
🔴平臺(tái)事務(wù)管理器對(duì)象
????????PlatformTransactionManager接口是spring的事務(wù)管理器,他里面提供了我們常用的操作事務(wù)的方法。
🔴事務(wù)定義對(duì)象
? ? ? ? TransactionDefinition內(nèi)部封裝控制事務(wù)的一些參數(shù)事務(wù)隔離級(jí)別
? ? ? ? 事務(wù)隔離性控制不好的情況下,會(huì)產(chǎn)生以下三個(gè)問題:臟讀、不可重復(fù)度、幻讀
一共有以下五種事務(wù)隔離級(jí)別
- ISOLATION_DEFAULT:默認(rèn)
- ISOLATION_READ_UNCOMMITTED:讀未提交
- ISOLATION_READ_COMMITTED:讀已提交(解決臟讀)
- ISOLATION_REPEATABLE_READ:可重復(fù)讀(解決不可重復(fù)讀)
- ISOLATION_SERIALIZABLE:串行化(解決三種問題,但是效率極低相當(dāng)于鎖表)
?事務(wù)傳播行為
? ? ? ? ?一個(gè)事務(wù)方法調(diào)用另一個(gè)事務(wù)是會(huì)具有事務(wù)傳播行為
🔴事務(wù)狀態(tài)對(duì)象?
? ? ? ? TransactionStatus接口提供的是事務(wù)具體的運(yùn)行狀態(tài)
聲明式事務(wù)控制
? ? ? ? spring的聲明事務(wù)控制就是采用生命的方式處理事務(wù),這里說的聲明就是指在配置文件中聲明,用在spring配置文件中聲明處理事物的方式代替代碼式的處理事務(wù)。聲明式事務(wù)控制可以將業(yè)務(wù)邏輯和事務(wù)管理相分離開,這樣在不需要事務(wù)管理的時(shí)候,只要在設(shè)定文件上修改即可移除事務(wù)管理服務(wù),無(wú)需改變代碼方便維護(hù)。Spring聲明式事務(wù)控制的底層就是AOP。
基于xml的聲明式事務(wù)控制
dao層:定義轉(zhuǎn)入轉(zhuǎn)出方法
?service層:實(shí)現(xiàn)轉(zhuǎn)入轉(zhuǎn)出的業(yè)務(wù)邏輯
?controller層:調(diào)用service層的方法進(jìn)行事務(wù)操作
????????如果xml文件中不進(jìn)行aop織入進(jìn)行事務(wù)增強(qiáng)的話,除數(shù)為零異常的拋出就會(huì)導(dǎo)致tom轉(zhuǎn)出500而lucy并沒有轉(zhuǎn)入500,接下來進(jìn)行事務(wù)控制配置
這樣的話就會(huì)在拋異常的同時(shí)兩人的賬戶余額都不會(huì)改變?
基于注解的聲明式事務(wù)控制
使用@Repository注解和@Service注解代替AccountDaoImpl和AccountServiceImpl的bean標(biāo)簽,使用@Transactional注解代替aop織入和事務(wù)增強(qiáng)設(shè)置
?
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
上一篇:【SSM面向CRUD編程專欄 6】springMVC攔截器、異常處理 jdbcTemplate
下一篇:【SSM面向CRUD編程專欄 8】一篇博客快速上手使用MyBatis進(jìn)行CRUD
?
總結(jié)
以上是生活随笔為你收集整理的【SSM面向CRUD编程专栏 7】springAop 事务控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gho怎么安装u盘安装 使用U盘安装gh
- 下一篇: os.environ[‘CUDA_VIS