簡(jiǎn)版AOP

(Why)為什么會(huì)有AOP:

(目前理解)業(yè)務(wù)代碼被重復(fù)性的非核心的代碼所混淆,并且占據(jù)了大量的空間,造成混亂。比如:log,數(shù)據(jù)庫(kù)的連接與關(guān)閉,數(shù)據(jù)庫(kù)事務(wù)的控制以及控制方法的訪問(wèn)權(quán)限等等。

  public void test(String param) {
      LogUtils.info("==> [test] starts, the param: " + param);
      // do something
      // ....
      LogUtils.info("<== [test] end);  
  }

可以看到log是非核心代碼,但是在各個(gè)方法中都會(huì)有出現(xiàn)。所以希望能夠?qū)I(yè)務(wù)代碼與非核心代碼隔離開(kāi)來(lái)。

(How)怎么解決呢:

觀察這些非核心代碼,應(yīng)該有會(huì)發(fā)現(xiàn)他們基本上出現(xiàn)在方法的前面和后面位置,那么能不能轉(zhuǎn)化成另一種形式:

  public void test(String param)  {
      LogUtils.info("==> [test] starts, the param: " + param);
      test(param);   //此處調(diào)用目標(biāo)方法,當(dāng)然該方法中不必有l(wèi)og代碼了
      LogUtils.info("<== [test] end); 
 }

我們希望有一項(xiàng)技術(shù)能夠幫我們 自動(dòng)的 給特定方法 都生成 相應(yīng)的帶有增強(qiáng)性功能的方法。即 動(dòng)態(tài)代理。


/**
 * Created by xiaoyiyiyo on 2018/5/23.
 */
public class ProxyFactory implements InvocationHandler{

    //目標(biāo)類
    private Object target;

    //提供構(gòu)造函數(shù),支持目標(biāo)類傳入
    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 核心方法:用于增強(qiáng)以及回調(diào)目標(biāo)方法
     * @param proxy 代理對(duì)象
     * @param method 目標(biāo)方法對(duì)象,可用于回調(diào)
     * @param args 目標(biāo)方法的參數(shù)值
     * @return 一般用于返回目標(biāo)方法的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // args即為目標(biāo)方法的參數(shù)值,可以再細(xì)致化處理
        LogUtils.info("==> [test] starts, the param: " + args.toString());

        // 可以在這里利用method反射 過(guò)濾判斷增強(qiáng)目標(biāo)類的哪些特定方法
        // 此處調(diào)用目標(biāo)方法
        Object result = method.invoke(target, args);

        LogUtils.info("<== [test] end");
        return result;
    }

    // 獲取代理對(duì)象
    public Object getProxy() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }
}

這樣得到一個(gè)目標(biāo)類的代理類,利用這個(gè)代理類來(lái)代替原來(lái)的類進(jìn)行我們的業(yè)務(wù)處理操作。
動(dòng)態(tài)代理主要有兩種: JDK動(dòng)態(tài)代理, CGLib動(dòng)態(tài)代理 (自行研究它們的原理。)
區(qū)別:
JDK動(dòng)態(tài)代理,需要目標(biāo)類有接口,生成的代理類實(shí)現(xiàn)這個(gè)接口,這樣可以包含目標(biāo)類的所有方法。
CGLib動(dòng)態(tài)代理,可以不需要有接口,利用目標(biāo)類作為父類,生成的代理類繼承目標(biāo)類,同樣可以拿到目標(biāo)類的方法。

總結(jié)一句話:

AOP: 在內(nèi)存中臨時(shí)生成一個(gè)AOP代理對(duì)象,這個(gè)對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切點(diǎn)(某些方法)做了增強(qiáng)處理(非核心代碼),回調(diào)原對(duì)象的方法。

怎么完善AOP(自己實(shí)現(xiàn)簡(jiǎn)版AOP)

幾個(gè)關(guān)鍵概念:
通知(advise): 即想要的功能代碼,如 日志,事務(wù),安全等。一般包含before, after方法,用來(lái)表明增強(qiáng) 目標(biāo)方法的前面還是后面。
切入點(diǎn)(Pointcut): 即需要增強(qiáng) 哪些目標(biāo)類哪些方法
通知器(advisor): advise + pointcut, 這樣一起就表明: 在哪里干什么,什么時(shí)候干。
切面(Aspect): 類似于通知器,代碼寫法不一樣而已。

實(shí)現(xiàn)AOP框架的流程:=。=
。。。待續(xù)(有點(diǎn)忙,容我構(gòu)思下語(yǔ)言和繪圖,最近幾天出爐)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一> 代理模式 概述 代理(Proxy)是一種設(shè)計(jì)模式, 提供了對(duì)目標(biāo)對(duì)象另外的訪問(wèn)方式;即通過(guò)代理訪問(wèn)目標(biāo)對(duì)象。...
    奮斗的老王閱讀 1,211評(píng)論 0 50
  • 一、AOP的基礎(chǔ) 1.1、AOP是什么??? 考慮這樣一個(gè)問(wèn)題:需要對(duì)系統(tǒng)中的某些業(yè)務(wù)做日志記錄,比如支付系統(tǒng)中的...
    聶叼叼閱讀 2,213評(píng)論 2 17
  • AOP實(shí)現(xiàn)可分為兩類(按AOP框架修改源代碼的時(shí)機(jī)): 靜態(tài)AOP實(shí)現(xiàn):AOP框架在編譯階段對(duì)程序進(jìn)行修改,即實(shí)現(xiàn)...
    數(shù)獨(dú)題閱讀 2,399評(píng)論 0 22
  • 媽媽很興奮的回來(lái)告訴桑桑:“哥哥帶回來(lái)了一個(gè)姐姐,去看看啊!”說(shuō)話的眼睛里幾乎閃著光,如果不是媽媽一跑回來(lái)就咧開(kāi)嗓...
    靚小寶閱讀 1,078評(píng)論 0 0
  • 今早刷微信公眾號(hào)時(shí),看到了一篇名為《天津6歲神童事件:我終于明白,千萬(wàn)別在“垃圾堆”養(yǎng)孩子!》的推文,原本...
    月泠閱讀 6,825評(píng)論 0 1

友情鏈接更多精彩內(nèi)容