代理設計模式的原理:使用一個代理將本來對象包裝起來,而後用該代理對象」取代」原始對象。任何對原始對象的調用都要經過代理。代理對象決定是否以及什麼時候將方法調用轉到原始對象上。spring
橫切關注點:從每一個方法中抽取出來的同一類非核心業務。數據庫
切面(Aspect):封裝橫切關注點信息的類,每一個關注點體現爲一個通知方法。express
通知(Advice):切面必需要完成的各個具體工做編程
目標(Target):被通知的對象設計模式
代理(Proxy):向目標對象應用通知以後建立的代理對象服務器
鏈接點(Joinpoint):橫切關注點在程序代碼中的具體體現,對應程序執行的某個特定位置。例如:類某個方法調用前、調用後、方法捕獲到異常後等。併發
切入點(pointcut):定位鏈接點的方式。每一個類的方法中都包含多個鏈接點,因此鏈接點是類中客觀存在的事物。框架
AspectJ:Java社區裏最完整最流行的AOP框架。在Spring2.0以上版本中,可使用基於AspectJ註解或基於XML配置的AOP。模塊化
1.導入JAR包性能
2.引入aop名稱空間
3.配置
<aop:aspectj-autoproxy>
當Spring IOC容器偵測到bean配置文件中的<aop:aspectj-autoproxy>元素時,會自動爲 與AspectJ切面匹配的bean建立代理
切入點表達式的語法格式
execution([權限修飾符] [返回值類型] [簡單類名/全類名] [方法名]([參數列表])) |
<!-- 【攔截全部public方法】 --> <aop:pointcut expression="execution(public * *(..))" id="pt"/> <!-- 【攔截全部save開頭的方法 】 --> <aop:pointcut expression="execution(* save*(..))" id="pt"/> <!-- 【攔截指定類的指定方法, 攔截時候必定要定位到方法】 --> <aop:pointcut expression="execution(public * cn.itcast.g_pointcut.OrderDao.save(..))" id="pt"/> <!-- 【攔截指定類的全部方法】 --> <aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.*(..))" id="pt"/> <!-- 【攔截指定包,以及其自包下全部類的全部方法】 --> <aop:pointcut expression="execution(* cn..*.*(..))" id="pt"/> <!-- 【取非值】 --> <aop:pointcut expression="!execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>
切入點表達式應用到實際的切面類中
在JavaEE企業級開發的應用領域,爲了保證數據的完整性和一致性,必須引入數據庫事務的概念,因此事務管理是企業級應用程序開發中必不可少的技術。
事務就是一組因爲邏輯上緊密關聯而合併成一個總體(工做單元)的多個數據庫操做,這些操做要麼都執行,要麼都不執行。
事務的四個關鍵屬性(ACID):
①原子性(atomicity):「原子」的本意是「不可再分」,事務的原子性表現爲一個事務中涉及到的多個操做在邏輯上缺一不可。事務的原子性要求事務中的全部操做要麼都執行,要麼都不執行。
②一致性(consistency):「一致」指的是數據的一致,具體是指:全部數據都處於知足業務規則的一致性狀態。一致性原則要求:一個事務中無論涉及到多少個操做,都必須保證事務執行以前數據是正確的,事務執行以後數據仍然是正確的。若是一個事務在執行的過程當中,其中某一個或某幾個操做失敗了,則必須將其餘全部操做撤銷,將數據恢復到事務執行以前的狀態,這就是回滾。
③隔離性(isolation):在應用程序實際運行過程當中,事務每每是併發執行的,因此頗有可能有許多事務同時處理相同的數據,所以每一個事務都應該與其餘事務隔離開來,防止數據損壞。隔離性原則要求多個事務在併發執行過程當中不會互相干擾。
④持久性(durability):持久性原則要求事務執行完成後,對數據的修改永久的保存下來,不會因各類系統錯誤或其餘意外狀況而受到影響。一般狀況下,事務對數據的修改應該被寫入到持久化存儲器中。
當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運行,也可能開啓一個新事務,並在本身的事務中運行。
事務的傳播行爲能夠由傳播屬性指定。Spring定義了7種類傳播行爲。
事務傳播屬性能夠在@Transactional註解的propagation屬性中定義。
假設如今有兩個事務:Transaction01和Transaction02併發執行。
①Transaction01將某條記錄的AGE值從20修改成30。
②Transaction02讀取了Transaction01更新後的值:30。
③Transaction01回滾,AGE值恢復到了20。
④Transaction02讀取到的30就是一個無效的值。
2.不可重複讀
①Transaction01讀取了AGE值爲20。
②Transaction02將AGE值修改成30。
③Transaction01再次讀取AGE值爲30,和第一次讀取不一致。
①Transaction01讀取了STUDENT表中的一部分數據。
②Transaction02向STUDENT表中插入了新的行。
③Transaction01讀取了STUDENT表時,多出了一些行。
數據庫系統必須具備隔離併發運行各個事務的能力,使它們不會相互影響,避免各類併發問題。一個事務與其餘事務隔離的程度稱爲隔離級別。SQL標準中規定了多種事務隔離級別,不一樣隔離級別對應不一樣的干擾程度,隔離級別越高,數據一致性就越好,但併發性越弱。
1.讀未提交:READ UNCOMMITTED
容許Transaction01讀取Transaction02未提交的修改。
2.讀已提交:READ COMMITTED
要求Transaction01只能讀取Transaction02已提交的修改。
3.可重複讀:REPEATABLE READ
確保Transaction01能夠屢次從一個字段中讀取到相同的值,即Transaction01執行期間禁止其它事務對這個字段進行更新。
4.串行化:SERIALIZABLE
確保Transaction01能夠屢次從一個表中讀取到相同的行,在Transaction01執行期間,禁止其它事務對這個表進行添加、更新、刪除操做。能夠避免任何併發問題,但性能十分低下。
5.各個隔離級別解決併發問題的能力見下表
|
髒讀 |
不可重複讀 |
幻讀 |
READ UNCOMMITTED |
有 |
有 |
有 |
READ COMMITTED |
無 |
有 |
有 |
REPEATABLE READ |
無 |
無 |
有 |
SERIALIZABLE |
無 |
無 |
無 |
6.各類數據庫產品對事務隔離級別的支持程度
|
Oracle |
MySQL |
READ UNCOMMITTED |
false |
true |
READ COMMITTED |
true(默認) |
true |
REPEATABLE READ |
false | true(默認) |
SERIALIZABLE |
true | true |
用@Transactional註解聲明式地管理事務時能夠在@Transactional的isolation屬性中設置隔離級別
在Spring 2.x事務通知中,能夠在<tx:method>元素中指定隔離級別