[6]-AOP動態代理

AOP術語

  • 連接點:被我們攔截到的那個方法
  • 切面的切點:指定希望在程序流中攔截的連接點
  • 切面的通知類型
    • 1)前置:在連接點之前
    • 2)後置:在連接點正常完成之後
    • 3)異常:在方法拋出異常退出時
    • 4)最終:2)後置 + 3)異常
    • 5)環繞:可改變參數和返回結果,容易忘記執行原始的方法,invocation.proceed()

使用AOP:基於註解

  • 1)定義切面:MarinlogService接口,是一個註解
  • MarinlogUser類,使用@Aspect修飾
    • 切入點和切入類型
  • 連接點:
    • MarinlogUser類中

代理

public static void main(String[] args){
    RealPerson xiaoMing=new RealPerson();
    ProxyPerson  proxy=new ProxyPerson(xiaoMing);
        proxy.sentGigt(1);
}

public interface abstractPerson {
    public void sentGigt(int toPersonId);
}
public class RealPerson implements abstractPerson{
    @Override
    public void sentGigt(int toPersonId){
        Print.print(" 被代理的類");      
    }
}
public class ProxyPerson implements abstractPerson{
    public RealPerson real;
    public ProxyPerson(RealPerson real){
        this.real=real;
    }
    @Override
    public void sentGigt(int toPersonId){
        real.sentGigt(toPersonId);
    }
}
  • 靜態代理:與反射無關,運行前,代理類的class 文件已生成,編譯期間進行靜態織入
  • 動態代理:反射生成代理類的字節碼
    • 定義proxyHandler,實現InvocationHandler接口,持有被代理接口的引用,重寫invoke()
    • Proxy.newProxyInstance(加載器,接口列表,proxyHandler)生成代理類對象,
    • 繼承了Proxy類,實現了被代理者的所有接口,final
  • cglib(代理類)
    • 若被代理者沒有實現任何接口,創建cglib代理,使用ASM(java字節碼處理框架)
    • 可強制 < aop:aspectj-autoproxy proxy-target-class=”true”/>

AOP介紹

  • AOP是對OOP思想的補充和完善,OOP引進”抽象-封裝-繼承-多態”等概念,進行由上到下的抽象和層次封裝

    • 但是具體細粒度到每個事物內部的情況,OOP就顯得無能爲力了,比如日誌功能。
    • 日誌代碼往往水平地散佈在所有對象層次當中,與它所散佈到的對象的核心功能無關。
    • 導致了大量代碼的重複,不利於各個模塊的重用
  • 橫切技術

    • 剖解開封裝的對象內部,將公共行爲封裝成一個獨立的模塊(切面)
    • 又能將剖開的切面復原,融入核心業務邏輯中。這樣,能便於之後橫切功能的編輯和重用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章