茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    手把手教你用Java實現(xiàn)AOP
    來源:易賢網(wǎng) 閱讀:803 次 日期:2015-04-10 14:12:09
    溫馨提示:易賢網(wǎng)小編為您整理了“手把手教你用Java實現(xiàn)AOP”,方便廣大網(wǎng)友查閱!

    介紹

    眾所周知,AOP(面向切面編程)是Spring框架的特色功能之一。通過設(shè)置橫切關(guān)注點(cross cutting concerns),AOP提供了極高的擴展性。那AOP在Spring中是怎樣運作的呢?當(dāng)你只能使用core java,卻需要AOP技術(shù)時,這個問題的解答變得極為關(guān)鍵。不僅如此,在高級技術(shù)崗位的面試中,此類問題也常作為考題出現(xiàn)。這不,我的朋友最近參加了一個面試,就被問到了這樣一個棘手的問題——如何在不使用Spring及相關(guān)庫,只用core Java的條件下實現(xiàn)AOP。因此,我將在本文中提供一份大綱,幫助大家了解如何只用core Java實現(xiàn)一個AOP(當(dāng)然啦,這種AOP在功能上有一定的局限性)。注意,本文不是一篇有關(guān)Spring AOP與Java AOP的對比研究,而是有關(guān)在core Java中借助固有的設(shè)計模式實現(xiàn)AOP的教程。

    想必讀者已經(jīng)知道AOP是什么,也知道在Spring框架中如何使用它,因此本文只著眼于如何在不用Spring的前提下實現(xiàn)AOP。首先,我們得知道,Spring是借助了JDK proxy和CGlib兩種技術(shù)實現(xiàn)AOP的。JDK dynamic proxy提供了一種靈活的方式來hook一個方法并執(zhí)行指定的操作,但執(zhí)行操作時得有一個限制條件:必須先提供一個相關(guān)的接口以及該接口的實現(xiàn)類。實踐出真知,讓我們透過一個案例來理解這句吧!現(xiàn)在有一個計算器程序,用于完成一些數(shù)學(xué)運算。讓我們來考慮下除法功能,此時的問題是:如果core framework 已經(jīng)具備了一份實現(xiàn)除法的代碼,我們能否在代碼執(zhí)行時劫持(highjack)它并執(zhí)行額外的校驗?zāi)??答案是肯定的,我將用下面提供的代碼片段來證明這點。首先來看基礎(chǔ)接口的代碼:

    public interface Calculator {

    public int calculate( int a , int b);

    }

    該接口實現(xiàn)類的代碼如下:

    public class CalculatorImpl implements Calculator {

    @Override

    public int calculate(int a, int b) {

    return a/b;

    }

    }

    假設(shè)我們既不能修該上面的代碼,也不能對核心庫進行任何改動,怎樣才能完美地實現(xiàn)校驗功能呢?不如試下JDK dynamic proxy的功能吧。

    public class SomeHandler implements InvocationHandler {

    // Code omitted for simplicity…..

    @Override

    public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {

    // Your complex business validation and logic

    Object result = method.invoke(targetObject ,params);

    return result;

    }

    }

    讓我們通過測試類來看看由JDK dynamic proxy實現(xiàn)的校驗功能的效果如何。

    public static void main(String[] args) {

    CalculatorImpl calcImpl = new CalculatorImpl();

    Calculator proxied = (Calculator)ProxyFactory.getProxy (Calculator.class, calcImpl,

    new SomeHandler(calcImpl));

    int result = proxied.calculate(20, 10);

    System.out.println("FInal Result :::" + result);

    }

    從結(jié)果可以看出,簡單地實現(xiàn)功能強大的InvocationHandler接口,我們便能得到一個hooking implementation。按照J(rèn)DK文檔的描述,InvocationHandler接口是借助一個代理實例(proxy instance)來處理一個方法調(diào)用的。

    現(xiàn)在我們已經(jīng)知道,InvocationHandler的invoke()方法能夠幫助我們解決問題。那么再來解決一個新問題——怎樣才能在方法執(zhí)行的前后執(zhí)行操作呢?說的更具體一些,我們能通過添加多個aop(before、after、around)來hook一個方法嗎(譯注:原文為add multiple aops,但我認(rèn)為Handler是充當(dāng)Aspect的角色)?答案同樣是肯定的。按照以下的步驟建立一個精簡的代碼模板便能滿足這樣的需求:

    創(chuàng)建一個抽象類,用于將aop應(yīng)用于目標(biāo)對象上。

    創(chuàng)建名為BeforeHandler 和 AfterHandler的兩個aop。前者在方法執(zhí)行之前工作,而后者則在方法執(zhí)行結(jié)束后工作。

    創(chuàng)建一個代理類,使所有的aop handler和目標(biāo)對象只需作為參數(shù)傳入,就能創(chuàng)建一個hook。

    加入你自己的業(yè)務(wù)邏輯或者橫切關(guān)注點。

    最后,通過傳入相關(guān)的參數(shù)創(chuàng)建代理對象(proxy object)。

    技術(shù)實現(xiàn)概要

    (譯注:此處是核心代碼片段,如果想運行該實例,需進入下方提供的鏈接下載完整代碼)

    創(chuàng)建一個handler的抽象類:

    public abstract class AbstractHandler implements InvocationHandler {

    private Object targetObject;

    public void setTargetObject(Object targetObject) {

    this.targetObject = targetObject;

    }

    }

    創(chuàng)建名為BeforeHandler和AfterHandler的兩個易擴展的handler抽象類:

    public abstract class BeforeHandler extends AbstractHandler {

    public abstract void handleBefore(Object proxy, Method method, Object[] args);

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    handleBefore(proxy, method, args);

    return method.invoke(getTargetObject(), args);

    public abstract class AfterHandler extends AbstractHandler {

    public abstract void handleAfter(Object proxy, Method method, Object[] args);

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    Object result = method.invoke(getTargetObject(), args);

    handleAfter(proxy, method, args);

    return result;

    }

    }

    創(chuàng)建Proxy的工廠類:

    public class ProxyFactory {

    public static Object getProxy(Object targetObject,

    List handlers) {

    //Code to get the proxy

    return proxyObject;

    } else {

    return targetObject;

    }

    }

    }

    以下為測試代碼:

    CalculatorImpl calcImpl = new CalculatorImpl();

    BeforeHandler before = new BeforeHandlerImpl();

    AfterHandler after = new AfterHandlerImpl();

    List<AbstractHandler> handlers = new ArrayList<AbstractHandler>();

    handlers.add(before);

    handlers.add(after);

    Calculator proxy = (Calculator) ProxyFactory.getProxy(calcImpl,

    handlers);

    int result = proxy.calculate(20, 10);

    配置

    以上的代碼片段簡明扼要地解釋了AOP在結(jié)構(gòu)上的實現(xiàn)(structural implementation)。當(dāng)然,如果能通過實際的測試將其運用到現(xiàn)實中去,那就再好不過了。讀者可在下面的鏈接中獲取完整的工程文件,并在Java編輯器中配置它們,最后通過其中的測試類來檢驗效果。

    總結(jié)

    希望這篇簡短的有關(guān)AOP文章能夠幫助到大家。需說明的是,本文只實現(xiàn)了before和after兩種aop,而另外兩種,即“Around”和“Throw”,則希望讀者自行完成。

    更多信息請查看IT技術(shù)專欄

    更多信息請查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機網(wǎng)站地址:手把手教你用Java實現(xiàn)AOP
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報班

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報警專用圖標(biāo)