AV大片,日韩伦理一区,国产在线a,开心播播网婷婷在线

哈爾濱今日靈圖

[其他技能培訓]
獵學網(wǎng)訂閱號
獵學網(wǎng)官方企業(yè)微信
位置: 獵學網(wǎng) > 學校機構 > 哈爾濱今日靈圖 > 學習資訊> 手把手教你用 Java 實現(xiàn) AOP

手把手教你用 Java 實現(xiàn) AOP

117 2017-04-19

介紹

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

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

publicinterfaceCalculator{

publicintcalculate(inta,intb);

}

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

publicclassCalculatorImplimplementsCalculator{

@Override

publicintcalculate(inta,intb){

returna/b;

}

}

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

publicclassSomeHandlerimplementsInvocationHandler{

//Codeomittedforsimplicity…..

@Override

publicObjectinvoke(Objectproxy,Methodmethod,Object[]params)throwsThrowable{

//Yourplexbusinessvalidationandlogic

Objectresult=method.invoke(targetObject,params);

returnresult;

}

}

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

publicstaticvoidmain(String[]args){

CalculatorImplcalcImpl=newCalculatorImpl();

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

newSomeHandler(calcImpl));

intresult=proxied.calculate(20,10);

System.out.println("FInalResult:::"+result);

}

從結果可以看出,簡單地實現(xiàn)功能強大的InvocationHandler接口,我們便能得到一個hookingimplementation。按照JDK文檔的描述,InvocationHandler接口是借助一個代理實例(proxyinstance)來處理一個方法調用的。

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

1.

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

2.

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

3.

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

4.

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

5.

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

技術實現(xiàn)概要

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

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

publicabstractclassAbstractHandlerimplementsInvocationHandler{

privateObjecttargetObject;

publicvoidsetTargetObject(ObjecttargetObject){

this.targetObject=targetObject;

}

}

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

publicabstractclassBeforeHandlerextendsAbstractHandler{

publicabstractvoidhandleBefore(Objectproxy,Methodmethod,Object[]args);

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

handleBefore(proxy,method,args);

returnmethod.invoke(getTargetObject(),args);

}

}

publicabstractclassAfterHandlerextendsAbstractHandler{

publicabstractvoidhandleAfter(Objectproxy,Methodmethod,Object[]args);

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

Objectresult=method.invoke(getTargetObject(),args);

handleAfter(proxy,method,args);

returnresult;

}

}

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

publicclassProxyFactory{

publicstaticObjectgetProxy(ObjecttargetObject,

Listhandlers){

//Codetogettheproxy

returnproxyObject;

}else{

returntargetObject;

}

}

}

以下為測試代碼:

CalculatorImplcalcImpl=newCalculatorImpl();

BeforeHandlerbefore=newBeforeHandlerImpl();

AfterHandlerafter=newAfterHandlerImpl();

Listhandlers=newArrayList();

handlers.add(before);

handlers.add(after);

Calculatorproxy=(Calculator)ProxyFactory.getProxy(calcImpl,

handlers);

intresult=proxy.calculate(20,10);

配置

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

總結

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

請聯(lián)系網(wǎng)站客服,了解詳細的優(yōu)惠課程信息~

優(yōu)質、權威、便捷、省心

溫馨提示: 專業(yè)老師1對1為您解答    馬上填寫,¥1000 元豪禮免費領!

掃一掃
獲取更多福利

×
獵學網(wǎng)
AV动态| 人妻少妇久久电影| 美腿丝袜AV无码AV| 99热在线播放| 久久国产精品网| 无码人妻免费电影| 美女黄片在线免费观看| 中文字幕有码无码| 秋霞麻豆天美| 黄色中日韩欧美| 亚洲AV日韩AV综合AⅤXXX| 日韩无码不卡高清视频| 亚洲一区二区三区国产精华液| 丁香婷婷丝袜蜜桃| 内射后入| 美女一级在现观看| 久久综合噜噜激激的五月天| 精品在线精品| 小说乱综合另类| 欧美乱妇欲仙欲死视频| 在线看黄片视频| 开心五月天网站| 麻豆京东天美| 亚洲AV网站| 久久精品久| 国产大屁股在线观看| 久久久久久久综合精品| 日韩特黄特色一区| 蜜臀在线观看麻豆| 8AV国产精品爽爽ⅴa在线观看| 国产XXXX精品视频| 天堂网AV免费| 在线观看亚洲av| 大香蕉久热| 久久是精品| 全部孕妇毛片丰满孕妇孕交 | 爱情岛亚洲av永久入口首页| aaa免费在线观看| 午夜免费在线无码区| 另类一区xxx| 国产乱码一区二区三区爽爽爽|