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