Spring AOP的實現(xiàn)原理詳解及實例
Spring AOP的實現(xiàn)原理詳解及實例
spring 實現(xiàn)AOP是依賴JDK動態(tài)代理和CGLIB代理實現(xiàn)的。
以下是JDK動態(tài)代理和CGLIB代理簡單介紹
JDK動態(tài)代理:其代理對象必須是某個接口的實現(xiàn),它是通過在運行期間創(chuàng)建一個接口的實現(xiàn)類來完成對目標(biāo)對象的代理。
CGLIB代理:實現(xiàn)原理類似于JDK動態(tài)代理,只是它在運行期間生成的代理對象是針對目標(biāo)類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的Java字節(jié)碼編輯類庫)操作字節(jié)碼實現(xiàn)的,性能比JDK強。
在Spring中,有接口時將采用JDK的方式實現(xiàn)proxy代理對象,當(dāng)沒有接口時,將采用cglib中的方式實現(xiàn)prixy代理對象。詳情如下:
// JDK方式:PersonService為接口,PersonServiceBean為實現(xiàn)類,
public class JDKProxyFactory implements InvocationHandler {
private Object targetObject;
public Object createProxyIntance(Object targetObject)
{
this.targetObject=targetObject;
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean person=(PersonServiceBean)this.targetObject;
Object result=null;
if(person.getUser()!=null)
{
result = method.invoke(targetObject, args);
}
return result;
}
}
//使用CGlib包實現(xiàn):PersonServiceBean為實現(xiàn)類, 而沒有PersonService接口,
public class CGlibProxyFactory implements MethodInterceptor{
private Object targetObject;
public Object createProxyInstance(Object targetObject)
{
this.targetObject=targetObject;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());//設(shè)置目標(biāo)類的子類,該子類會覆蓋所有父類中的非final方法
enhancer.setCallback(this);//設(shè)置回調(diào)
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
PersonServiceBean person=(PersonServiceBean)this.targetObject;
Object result=null;
if(person.getUser()!=null)
{
result = methodProxy.invoke(targetObject, args);
}
return null;
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
jsp中點擊圖片彈出文件上傳界面及預(yù)覽功能的實現(xiàn)
點擊圖片彈出文件上傳界面的效果,想必大家都有見到過吧,在本文為大家詳細(xì)介紹下在jsp中是如何實現(xiàn)的,并對具體的實現(xiàn)代碼做簡要的介紹,感興趣的朋友不要錯過2013-10-10
java Struts2 在攔截器里的跳轉(zhuǎn)問題
前幾天,自已寫了一個攔截器,當(dāng)在里面跳轉(zhuǎn)時,報了一個如下異常,但頁面能正常跳轉(zhuǎn)2009-07-07
Servlet+Jsp實現(xiàn)圖片或文件的上傳功能具體思路及代碼
web項目中的這一上傳功能,那么文件是如何從本地發(fā)送到服務(wù)器的呢,接下來為大家介紹下Servlet+Jsp實現(xiàn)文件的上傳功能,感興趣的朋友可以參考下哈2013-04-04
JAVA/JSP學(xué)習(xí)系列之八(改寫MySQL翻頁例子)
JAVA/JSP學(xué)習(xí)系列之八(改寫MySQL翻頁例子)...2006-10-10

