一 AOP(Aspect oriented programming) 面向方面編程
OOP面向對象編程
AOP和OOP雖然在字面上十分相似,但卻是面向不同領(lǐng)域的兩種設計思想.OOP是在面向過(guò)程的編程方法基礎上進(jìn)行的改進(jìn),而AOP面向方面編程又是在面向對象編程的基礎上進(jìn)行改進(jìn)而來(lái)的一種新的軟件開(kāi)發(fā)方法.OOP針對問(wèn)題領(lǐng)域中存在的實(shí)體及其屬性和操作進(jìn)行抽象和封裝,而AOP則是針對業(yè)務(wù)處理過(guò)程中的切面進(jìn)行提取.
例如: 某一操作在各個(gè)模塊中都有涉及,就可把這個(gè)操作"橫切"存在于系統當中,這些操作大都不屬于邏輯操作的部分,AOP就是將這些操作與業(yè)務(wù)邏輯分離,AOP所面對的是處理過(guò)程中的某個(gè)步驟或階段.
AOP的核心思想:
就是將應用程序中的業(yè)務(wù)邏輯處理部分同對其提供的通用服務(wù)部分即"橫切關(guān)注點(diǎn)"進(jìn)行分離.
二 Sping框架的特點(diǎn) AOP的應用
Spring框架目前如此流行,大概一方面是Spring提供了一套全面并且十分成熟的輕型應用程序基礎框架,對復雜的應用開(kāi)發(fā)提供了幫助,另一方面,實(shí)際開(kāi)發(fā)中Spring最大的優(yōu)勢在于它是從實(shí)際項目開(kāi)發(fā)經(jīng)驗中抽取的,并提供了豐富的類(lèi)庫,可大大節省編碼量,不過(guò)Spring框架中最吸引人的也是該應用框架最具特色的地方就是IoC控制反轉或者DI依賴(lài)注入.比如說(shuō) 不用你主動(dòng)來(lái)找我,我會(huì )通知你的
但是Spring最成功的地方還是AOP的應用.
Spring應用程序框架將AOP思想融入了整個(gè)框架的設計和開(kāi)發(fā)與應用中,實(shí)際上是一種設計式的擴展.其內置AOP默認是使用動(dòng)態(tài)代理模式實(shí)現,即在代碼中不出現與具體要用到的接口或者類(lèi)的引用. 即動(dòng)態(tài)代理的核心技術(shù)
三 Spring動(dòng)態(tài)代理機制的實(shí)現
通過(guò)動(dòng)態(tài)Proxy模式,在目標對象的方法調用前后插入相應的處理代碼,任何的接口都能被代理,也符合”面向接口編程”的良好風(fēng)格.
Spring實(shí)現原理,其內置的AOP默認使用動(dòng)態(tài)代理模式實(shí)現,即在代碼中不出現與具體應用相關(guān)的接口或者類(lèi)引用.即這個(gè)代理類(lèi)適用于任何接口的實(shí)現
例:
public class MyInvocationHandler implements InvocationHandler
{
private Object originalObject;
public Object bind(Object obj)
{
this.orginalObject = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy,Method method,Object [] args)throws Throwable
{
Object result = null;
result = method.invoke(originalObject,args);
return result;
}
}
分析一下上述代碼的關(guān)鍵
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
java.lang.reflect.Proxy.newProxyInstance方法根據傳入的接口類(lèi)型obj.getClass().getInterfaces()動(dòng)態(tài)構造出一個(gè)代理實(shí)例返回,這也說(shuō)明為什么動(dòng)態(tài)代理實(shí)現要求其所代理的對象一定要至少實(shí)現一個(gè)接口.因這個(gè)代理類(lèi)實(shí)例是在運行時(shí)從內存中動(dòng)態(tài)構造出的它實(shí)現了傳入的所有接口.
public Object invoke(Object proxy,Method method,Object [] args) throws Throwable
{
…
result = method.invoke(originalObject,args)
}
InvocationHandler.invoke方法將在代理類(lèi)的方法將在代理類(lèi)的方法被調用之前觸發(fā).通過(guò)這個(gè)方法,我們可以在被代理類(lèi)方法調用的前后進(jìn)行一些處理,在上述方法中,InvocationHandler.invoke方法的參數中傳遞了當前被調用的方法Method,被調用方法的參數args,通過(guò)method.invoke方法調用被代理類(lèi)的原始方法實(shí)現.這樣就可以在被代理類(lèi)的方法調用前后寫(xiě)入任何想要進(jìn)行的操作.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1201828