簡版AOP

(Why)為什么會有AOP:

(目前理解)業(yè)務代碼被重復性的非核心的代碼所混淆音念,并且占據(jù)了大量的空間站刑,造成混亂。比如:log宪睹,數(shù)據(jù)庫的連接與關閉,數(shù)據(jù)庫事務的控制以及控制方法的訪問權限等等蚕钦。

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

可以看到log是非核心代碼亭病,但是在各個方法中都會有出現(xiàn)。所以希望能夠?qū)I(yè)務代碼與非核心代碼隔離開來嘶居。

(How)怎么解決呢:

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

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

我們希望有一項技術能夠幫我們 自動的 給特定方法 都生成 相應的帶有增強性功能的方法整袁。即 動態(tài)代理。


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

    //目標類
    private Object target;

    //提供構造函數(shù)佑吝,支持目標類傳入
    public ProxyFactory(Object target) {
        this.target = target;
    }

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

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

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

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

這樣得到一個目標類的代理類芋忿,利用這個代理類來代替原來的類進行我們的業(yè)務處理操作炸客。
動態(tài)代理主要有兩種: JDK動態(tài)代理疾棵, CGLib動態(tài)代理 (自行研究它們的原理。)
區(qū)別:
JDK動態(tài)代理痹仙,需要目標類有接口是尔,生成的代理類實現(xiàn)這個接口,這樣可以包含目標類的所有方法蝶溶。
CGLib動態(tài)代理,可以不需要有接口宣渗,利用目標類作為父類抖所,生成的代理類繼承目標類,同樣可以拿到目標類的方法痕囱。

總結(jié)一句話:

AOP: 在內(nèi)存中臨時生成一個AOP代理對象田轧,這個對象包含了目標對象的全部方法,并且在特定的切點(某些方法)做了增強處理(非核心代碼)鞍恢,回調(diào)原對象的方法傻粘。

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

幾個關鍵概念:
通知(advise): 即想要的功能代碼,如 日志帮掉,事務弦悉,安全等。一般包含before, after方法蟆炊,用來表明增強 目標方法的前面還是后面稽莉。
切入點(Pointcut): 即需要增強 哪些目標類哪些方法
通知器(advisor): advise + pointcut, 這樣一起就表明: 在哪里干什么涩搓,什么時候干污秆。
切面(Aspect): 類似于通知器,代碼寫法不一樣而已昧甘。

實現(xiàn)AOP框架的流程:=良拼。=
。充边。庸推。待續(xù)(有點忙,容我構思下語言和繪圖浇冰,最近幾天出爐)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末予弧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子湖饱,更是在濱河造成了極大的恐慌掖蛤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件井厌,死亡現(xiàn)場離奇詭異蚓庭,居然都是意外死亡致讥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門器赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垢袱,“玉大人,你說我怎么就攤上這事港柜∏肫酰” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵夏醉,是天一觀的道長爽锥。 經(jīng)常有香客問我,道長畔柔,這世上最難降的妖魔是什么氯夷? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮靶擦,結(jié)果婚禮上腮考,老公的妹妹穿的比我還像新娘。我一直安慰自己玄捕,他們只是感情好踩蔚,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枚粘,像睡著了一般寂纪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赌结,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天捞蛋,我揣著相機與錄音,去河邊找鬼柬姚。 笑死拟杉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的量承。 我是一名探鬼主播搬设,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撕捍!你這毒婦竟也來了拿穴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤忧风,失蹤者是張志新(化名)和其女友劉穎默色,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狮腿,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡腿宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年呕诉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吃度。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡甩挫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椿每,到底是詐尸還是另有隱情伊者,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布间护,位于F島的核電站亦渗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兑牡。R本人自食惡果不足惜央碟,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一税灌、第九天 我趴在偏房一處隱蔽的房頂上張望均函。 院中可真熱鬧,春花似錦菱涤、人聲如沸苞也。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽如迟。三九已至,卻和暖如春攻走,著一層夾襖步出監(jiān)牢的瞬間殷勘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工昔搂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玲销,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓摘符,卻偏偏與公主長得像贤斜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逛裤,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一> 代理模式 概述 代理(Proxy)是一種設計模式瘩绒, 提供了對目標對象另外的訪問方式;即通過代理訪問目標對象带族。...
    奮斗的老王閱讀 1,104評論 0 50
  • 一锁荔、AOP的基礎 1.1、AOP是什么蝙砌?堕战?坤溃? 考慮這樣一個問題:需要對系統(tǒng)中的某些業(yè)務做日志記錄,比如支付系統(tǒng)中的...
    聶叼叼閱讀 2,108評論 2 17
  • AOP實現(xiàn)可分為兩類(按AOP框架修改源代碼的時機): 靜態(tài)AOP實現(xiàn):AOP框架在編譯階段對程序進行修改,即實現(xiàn)...
    數(shù)獨題閱讀 2,310評論 0 22
  • 媽媽很興奮的回來告訴桑桑:“哥哥帶回來了一個姐姐越驻,去看看爸!”說話的眼睛里幾乎閃著光缀旁,如果不是媽媽一跑回來就咧開嗓...
    靚小寶閱讀 950評論 0 0
  • 今早刷微信公眾號時记劈,看到了一篇名為《天津6歲神童事件:我終于明白,千萬別在“垃圾堆”養(yǎng)孩子并巍!》的推文目木,原本...
    月泠閱讀 5,350評論 0 1