1. 程式人生 > >Spring筆記:AOP基礎

Spring筆記:AOP基礎

style 分享 clas 邏輯 mvc 滿足 roles 連接 ring

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基礎