1.AOP總結:面向切面編程,在不驚動原始基礎上為方法進行功能增強。
2.AOP核心概念:
(1)代理:SpringAOP的核心是采用代理模式
(2)連接點:在SpringAOP中,理解為任意方法的執行
(3)切入點:匹配連接點的式子,也是具有共性功能的方法描述
(4)通知:若干個方法的共性功能,在切入點處執行,最終體現為一個方法。
(5)切面:描述通知和切入點的對應關系
(6)目標對象:被代理的原始對象成為目標對象
3.切入點表達式格式
(1)動作關鍵詞(訪問修飾符 返回值 包名.類名/接口名 (參數)異常名)
(2)切入點表達式描述通配符(快速描述、范圍描述)
*:匹配任意符號(常用)
… :匹配多個連續的任意符號(常用)
+:匹配子類類型
4.通知類型
(1)前置通知
(2)后置通知
(3)環繞通知(important)
1)環繞通知依賴形參ProceedingJoinPoint才能實現對原始方法的調用
2)環繞通知開源隔離原始方法的調用執行
3)環繞通知返回值設為Object類型
4)環繞通知開源對原始方法調用過程中出現的異常進行處理。
(4)返回后通知
(5)拋出異常后通知
補充:
(1)獲取切入點方法的參數:
JointPoint:適合前置、后置、返回后、拋出異常后通知,設置為方法的第一個形參。
ProceedJointPoint:適用于環繞通知
(2)獲取切入點方法返回值
返回后通知
環繞通知
(3)獲取切入點方法運行異常信息
拋出異常后通知
環繞通知
5.Spring事務簡介
(1)事務作用:在數據層保障一系列數據庫操作(同成功同失敗)
(2)Spring事務作用:在數據層或業務層保障一些列的數據庫操作(同成功同失敗)
接口是public interface platformTransactionManager(平臺事務管理器)
方法有commit、rollback
接口實現類是public class DataSourceTransactionManager
例子:模擬銀行賬戶間轉賬業務
需求:實現任意兩個賬戶間轉賬操作
(A賬號減錢,B賬戶加錢)
1)數據層提供基礎操作,指定賬戶減錢(outMoney),指定賬戶加錢(inMoney)
2)業務層提供轉賬操作(transfer),調用加錢和減錢操作。
3)提供2個賬號和操作金額執行轉賬操作
4)基于Spring整合MyBatis環境搭建上述操作
結果分析:
原本數據庫中A,B的賬戶金額都是1000.
1)程序正常執行,賬戶金額A-B+
2)程序出現異常后,轉賬失敗。異常之前操作成功,異常之后操作失敗,整體業務失敗。
(3)在業務層的接口,添加注解@Transaction
(4)在jdbc的配置中,通過Bean引入平臺事務管理器的操作(DataSource dataSource)
(5)接口實現類先注釋掉異常
(6)運行test,成功
(7)驗證使用Trasaction事務之后數據庫,會不會出現同成功同失敗的效果。
總結:
6.Spring事務角色
事務管理員、事務協調員
MybaticsConfig的SqlSessionFactory的DataSource和JdbcConfig的DataSource不是同一個,則不能運行成功。本次代碼能運行成功,是因為他們是通過同一個數據源DataSource進行管理.
7.Spring事務屬性
事務相關配置,案例:轉賬業務追加日志,事務傳播行為
內存異常,運行異常才能回滾。IOException不回滾,出現這種情況,我們要在接口的事務中添加rollbackfor
(1)案例:轉賬業務追加日志
需求:實現任意兩個賬戶間轉賬操作,每次轉賬操作在數據庫留痕。
(A減錢,B加錢,數據庫記錄日志)
1)基于轉賬操作案例添加日志模塊,實現數據庫中記錄日志
2)業務層轉賬操作(Transfer),調用減錢、加錢與記錄日志功能,實現預期效果。
無論轉賬操作是否成功,都進行轉賬操作的日志留痕。
<1>REQUIRED(默認),事務管理員開啟事務,事務協調員加入事務;事務管理員如果沒有事務 ,事務協調員新建事務。(但是這個造成了如果在轉賬中出現了i/0異常,不管轉賬是否成功,日志的信息并不會在數據庫出現,雖然金額沒錯保持原樣,但是日志信息沒有保存)
<2>REQUIRED_NEW,事務管理與開啟事務,事務協調員可以新建事務;如果事務協調員沒有事務,則事務協調員也會開啟任務。所以要在業務層接口添加Spring事務,設置事務傳播行為REQUIRES_NEW(需要新事務)