Spring筆記:AOP基礎
Spring筆記:AOP基礎
引入AOP
SpringIOC相對而言還是比較容易理解的,它是反射技術實現的。SpringAOP,最大的用處是事務的控制,這是最麻煩也是最難理解的東西。
SpringAOP是通過動態代理來實現的。首先在傳統MVC架構中,業務層一般都夾帶著數據庫的事務管理,例如,插入一個角色,它是使用RoleService接口的實現類RoleServerImpl來實現的。
當程序進入到insertRole方法的時候,Spring就會讀取配置的傳播行為進行設置,這裏的配置為Propagation.REQUIRED,它的意思是當前方法如果有事務則加入當前事務,否則就創建新的事務。這樣這個insertRole方法就在事務內調用了,那麽它是怎麽實現的呢?
我們不去描述太過抽象的概念,如切面、連接點、通知、切入點、目標對象、AOP代理等極其抽象的概念,而是從使用原理去討論他們。
動態代理
SpringAOP是動態代理的典範,我們需要先熟悉一下動態代理的相關概念。
Mybatis中,Mapper僅僅是一個接口,而不是一個包含邏輯的實現類,我們知道一個接口是無法去執行的,那麽它是如何運行的呢?這不是違反了教科書所說的接口不能運行的道理嗎?
答案就是動態代理,不妨先來看一下Mapper到底是什麽東西
很顯然Mapper產生了代理類,這個代理類是MyBatis為我們創建。
代理模式
所謂的代理模式就是在原有的服務上多加了一個占位,通過這個占位去控制服務的訪問
舉例子,假設你是一個公司的工程師,能提供一些技術服務,公司的客服是一個美女,他不懂技術。而我是一個客戶,徐你們公司提供技術服務。顯然,我只會找你們公司的客服,和客服溝通,而不是找你溝通。客服會根據公司的規章制度和業務規則來決定找不找你服務。那麽此時客服就等同於你的代理,她通過和我的交流來控制對你的訪問,當然他也可以提供一些你們公司對外的服務。而我只能通知他的代理訪問你。對我而言,我跟本不需要認識你,只需要認識客服就可以了。事實上,站在我的角度,我會認為客服就是代表你們公司,而不管真正為我服務的你是怎麽樣的。
其次,為什麽要用代理模式呢?通過代理可以控制如何訪問真正的服務對象,提供額外的服務
一般來說,代理分為兩種,一種是JDK反射機制提供的代理,另一種是CGLIB代理。
JDK動態代理
JDK的動態代理,是由JDK的Java.lang.reflect包提供支持的,我們需要完成幾個步驟:
- 編寫服務類和接口,這個是真正的服務提供者,在JDK代理中接口是必須的。
- 編寫代理類,提供綁定和代理方法。
JDK最大的缺點就是需要提供接口,而MyBatis的Mapper就是一個接口它采用的就是JDK的動態代理。我們先給一個服務接口。
public interface HelloService{ public void sayHello(String name); }
然後,寫一個實現類
public class HelloServiceImpl implements HelloService{ public void sayHello(String name) { System.out.println("Hello"+name); } }
現在我們寫一個代理類,提供真實對象的綁定和代理方法。代理類的要求是實現InvocationHandler接口的代理方法。
Spring筆記:AOP基礎