AOP全名爲Aspect-Oriented Programming,意思是面向橫切面編程,前邊咱們有過介紹 面向橫切面編程AOP的理解 ,咱們經過這種編程思想很容易的擴展咱們的應用程序。html
一,如何實現AOP編程思想呢?實現這種編程思想的一個重要手段就是代理模式或者說模仿代理模式的運用。尤爲是其中動態代理模式,JDK提供的Proxy的使用,這個在前邊也總結:Proxy代理模式的應用 而這種動態代理是基於接口的,也就是說代理對象和目標對象實現了同一個接口。而假如咱們應用中沒有使用接口,就沒法使用Proxy了。可是不要着急,CGLIB這個組件解決了這個問題,它正是彌補jdk中的不足,專門基於繼承來實現動態代理,其中代理對象是繼承目標對象進行擴展的。它和JDK提供的Proxy實現原理是很是相似的。這裏看一下網上的資料吧:java動態代理(JDK和cglib)java
二,事務(Trasaction)node
這個在數據庫中咱們學習過,爲何在這裏又提出來呢?由於Spring框架運用在咱們的service層。而事務的應用正是用到一個業務當中,也就是咱們的Service層,因此聲明式事務在Spring框架中的應用,也是其實現AOP編程思想很是出色的地方。下邊先看一下事務的基礎知識。spring
1,事務的四大特性:數據庫
原子性:指的是數據庫事務是一個不可分割的工做單元express
一致性:指的是數據庫事務不能破壞關係數據的完整性以及業務邏輯上的一致性。編程
隔離性:併發環境中,當不一樣的事務同時操做相同的數據時,每一個事務都有各自的完整數據空間。併發
持久性:只有事務提交,數據就所作的更新操做必須永久保存下來。app
2,多個事務嵌套時,幾種設置方法:框架
方式 |
說明 |
REQUIRED: |
業務方法須要在一個事務中運行,若是方法運行時,已經存在一個事務中,那麼加入到該事務,不然本身建立一個新事務。 |
SUPPORTS: |
若是存在一個事務,那麼使用當前事務,若是沒有事務,則不使用事務。 |
MANDATORY: |
若是有一個事務,則使用事務,若是沒有可使用的事務,則發生異常。 |
REQUIRESNEW: |
無論是否存在事務,業務方法總爲本身發起一個新事務;若是方法已經運行在一個事務中,則原有事務會被掛起,新的事務會被建立,直到方法調用結束,新事務才結束,原先的事務再恢復執行。 |
NOT_SUPPORTED: |
聲明方法不須要事務,若是方法沒有關聯到事務,容器不會爲它開啓事務,若是方法在一個事務中被調用,該事務會被掛起,在方法調用結束後,原先的事務便會恢復執行。 |
NEVER: |
業務方法絕對不能再事務範圍內執行,若是方法在某個事務中執行,容器會拋出例外,只有業務方法沒有關聯到任何事務,方法纔可以正常執行。 |
NESTED: |
若是一個活動的事務存在,則運行在一個嵌套的事務中,若是沒有活動事務,則按照REQUIRED屬性執行,它使用了一個單獨的事務,這個事務有多個能夠回滾的保存點,內部事務的回滾不會對外部事務產生影響。它只對DataSourceTransactionManager事務管理器有效。 |
3,事務的隔離級別:
級別 |
說明 |
ISOLATION_DEFAULT |
這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應 |
ISOLATION_READ_UNCOMMITTED |
這是事務最低的隔離級別,它充許別外一個事務能夠看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀 |
ISOLATION_READ_COMMITTED(Oracle默認隔離級別) |
保證一個事務修改的數據提交後才能被另一個事務讀取。另一個事務不能讀取該事務未提交的數據。這種事務隔離級別能夠避免髒讀出現,可是可能會出現不可重複讀和幻像讀。 |
ISOLATION_REPEATABLE_READ(MySQL默認隔離級別) |
這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現幻像讀。它除了保證一個事務不能讀取另外一個事務未提交的數據外,還保證了避免下面的狀況產生(不可重複讀)。 (行級鎖 select。。。for update) |
ISOLATION_SERIALIZABLE |
這是花費最高代價可是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。 |
三,聲明式事務的使用:
Spring默認狀況下是不支持AOP功能的,若是使用須要引入AspectJ jar包。AspectJ是專門來作AOP操做的框架,Spring能夠利用AspectJ進行AOP編程。看一下步驟吧!
1,拷貝相應的jar包:
commons-logging.jar
spring.jar(Spring核心jar包,支持IoC的jar包)
SPRING_HOME\lib\aspectj\aspectjrt.jar
SPRING_HOME\lib\aspectj\aspectjweaver.jar(支持AOP的jar包)
SPRING_HOME\lib\cglib\cglib-nodep-2.1_3.jar(支持繼承動態的jar包)
2,拷入的核心配置文件applicationContext.xml須要加入增長命名空間和約束文件:
<beans...
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
...
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
3,核心配置文件中啓用AOP功能:
<aop:aspectj-autoproxy/>
4, 定義目標類:
目標類能夠有接口,若是有接口Spring使用jdk動態代理產生代理對象,完成功能擴展。也能夠沒有接口,若是沒有接口,Spring使用cglib代理產生代理對象,完成功能擴展。
5,定義擴展對象,只是普通的javabean類,裏邊定義咱們擴展的方法便可!
6,在覈心配置文件中配置目標對象和代理對象,還有就是二者之間的關係,例如:
分析總結:這裏須要注意組合關係的編寫,例如匹配此事務的目標方法execution如何匹配,事務的隔離級別如何定義等。還須要注意的是,這裏寫了rollback-for="java.lang.Exception",由於Spring框架默認的是針對運行時異常進行回滾的,而對編譯時異常不會回滾,因此在這裏要進行聲明。更多關於組合對象之間的關係,能夠查看官網上的幫助文檔,上邊列舉的例子較多。
綜上爲Spring框架中的關於AOP的相關知識,須要咱們在實踐中不斷使用。固然了,Spring框架和其它框架集成起來了,纔會更強大的。後邊看框架的組合使用……