老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

Java中怎么利用動(dòng)態(tài)代理實(shí)現(xiàn)AOP功能

今天就跟大家聊聊有關(guān)Java中怎么利用動(dòng)態(tài)代理實(shí)現(xiàn)AOP功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司主營(yíng)橋西網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,APP應(yīng)用開(kāi)發(fā),橋西h5微信小程序開(kāi)發(fā)搭建,橋西網(wǎng)站營(yíng)銷(xiāo)推廣歡迎橋西等地區(qū)企業(yè)咨詢(xún)

一、Java編程使用的背景

也不能算是使用的背景,最多只能算是一個(gè)在什么條件下面我想到了使用動(dòng)態(tài)代理實(shí)現(xiàn)AOP的攔截功能):因?yàn)樵陧?xiàng)目中程序的結(jié)構(gòu)是使用SOAP調(diào)用JNI,因此在SOAP服務(wù)端里面沒(méi)有任何實(shí)現(xiàn)代碼,僅僅是new一個(gè)JNI的對(duì)象,然后調(diào)用JNI對(duì)應(yīng)的方法。但是在調(diào)用JNI方法之前需要對(duì)傳進(jìn)JNI的JavaBean進(jìn)行初始化,而且還需要記錄日志。而SOAP服務(wù)端的代碼是通過(guò)ant自動(dòng)生成的,需要對(duì)他進(jìn)行手工的修改,在修改過(guò)程中發(fā)現(xiàn)每一個(gè)方法里面都是相同的:記錄進(jìn)入方法的日志、初始化JavaBean和記錄退出方法的日志,這寫(xiě)東西都是通過(guò)拷貝粘貼來(lái)完成的,想到如果以后再加一個(gè)什么功能的時(shí)候又得每一個(gè)方法進(jìn)行拷貝粘貼,而且方法的數(shù)量還不少,所以覺(jué)得這樣來(lái)實(shí)現(xiàn)是不科學(xué)的。示例代碼如下: 

public class SOAP{    private JniInterface jni = null;    private Log log = 。。。;    public SOAP(){    jni=new JniClass();    }     /**方法A**/    public JavaBeanA aMethod(JavaBeanA javaBeanA){    log.debug("進(jìn)入A方法");    //初始化JavaBean    Init(javaBeanA);    //調(diào)用JNI對(duì)應(yīng)的方法    JavaBeanA result = jni.aMethod(javaBeanA);    log.debug("退出A方法");    return result;    }    ……………………………………    ……………………………………    等等,很多這樣的方法    ……………………………………    ……………………………………    }

從示例代碼里面可以看出,除了調(diào)用JNI對(duì)應(yīng)的方法不同之外,其他的都是相同的代碼,把所有的東西進(jìn)行拷貝復(fù)制是不合理的。每當(dāng)對(duì)SOAP進(jìn)行修改,就必須將所有的方法重新拷貝粘貼。為了省去拷貝粘貼這一工序,所以使用動(dòng)態(tài)代理實(shí)現(xiàn)AOP攔截共能。

二、實(shí)現(xiàn)AOP攔截

1.定義Interceptor接口

public interface Interceptor {    //在調(diào)用之前調(diào)用該方法    public void before(InvokeJniInfo invInfo);    //在調(diào)用之后調(diào)用該方法    public void after(InvokeJniInfo invInfo);    //出現(xiàn)異常之后調(diào)用該方法    public void exceptionThrow(InvokeJniInfo invInfo);    }

2. 定義 InvokeJniInfo 類(lèi)

在Interceptor接口中的InvokeJniInfo類(lèi),該類(lèi)的定義如下:

public class InvokeJniInfo {    //被代理的對(duì)象    Object proxy;    //被調(diào)用的方法    Method method;    //被調(diào)用方法的參數(shù)列表    Object[] args;    //調(diào)用之后的結(jié)果    Object result;    //拋出的異常    Throwable exception;     public InvokeJniInfo(Object proxy,    Method method,    Object[] args,    Object result,    Throwable exception){    this.proxy = proxy;    this.method = method;    this.args = args;    this.result = result;    this.exception = exception;    }    …………………………………………………………    …………………………………………………………

所有成員的get/set方法

…………………………………………………………

…………………………………………………………

}

從該類(lèi)的成員變量可以知道,這個(gè)類(lèi)使用來(lái)將調(diào)用函數(shù)的基本信息如代理的對(duì)象,調(diào)用的方法,調(diào)用方法的參數(shù)等信息傳遞給Interceptor,使得在Interceptor 之中可以通過(guò)使用該對(duì)象作出相應(yīng)的攔截。


3.實(shí)現(xiàn)一個(gè)抽象的攔截器AbstractInterceptor

該攔截器實(shí)現(xiàn)了Interceptor接口,它里面的方法全都是空的,其目的是當(dāng)某些攔截器只是需要實(shí)現(xiàn)三個(gè)方法中的一個(gè)方法或者兩個(gè)方法的時(shí)候,就可以繼承該抽象類(lèi),覆蓋需要的實(shí)現(xiàn)的方法就可以了。

4.實(shí)現(xiàn)日志記錄攔截器LogInterceptor

該攔截器主要是實(shí)現(xiàn)在調(diào)用之前記錄日志,調(diào)用之后記錄日志和出現(xiàn)異常的時(shí)候記錄日志。其代碼如下:

public class LogInterceptor implements Interceptor {private Log log = LogFactory.getLog(“初始化Log” );public void before(InvokeJniInfo invInfo) {//調(diào)用InvokeJniInfo對(duì)象的Method的getName方法獲取方法名log.debug("Enter the" + invInfo.getMethod().getName());}public void after(InvokeJniInfo invInfo) {//調(diào)用InvokeJniInfo對(duì)象的Method的getName方法獲取方法名log.debug("Exit the" + invInfo.getMethod().getName());}public void exceptionThrow(InvokeJniInfo invInfo) {//調(diào)用InvokeJniInfo對(duì)象的Method的getName方法獲取方法名log.error("Call the" + invInfo.getMethod().getName() + " has error!");//調(diào)用InvokeJniInfo對(duì)象的Exception的getStackTrace方法獲取具體異常并記錄log.error(invInfo.getException().getStackTrace());   }    }

5.實(shí)現(xiàn)初始化JavaBean攔截器InitParamsInterceptor

該類(lèi)繼承AbstractInterceptor,只需覆蓋before方法即可。其代碼如下:

public class InitParamsInterceptor extends AbstractInterceptor {     public void before(InvokeJniInfo invInfo) {    if(invInfo.getArgs().length>0){

//初始化***個(gè)參數(shù)

InitContainsObjectNullUtil.initContainsOutParameter(invInfo.getArgs()[0]);   }    }     }

6.實(shí)現(xiàn)動(dòng)態(tài)代理處理器InterceptorHandler

該類(lèi)實(shí)現(xiàn)了java.lang.reflect.InvocationHandler接口。

  1. public class InterceptorHandler implements InvocationHandler {

  2. private static Log log = LogFactory.getLog(InterceptorHandler.class);

  3. //攔截器列表

  4. private List interceptors = null;

  5. //存放原始對(duì)象

  6. private Object orginalObject;

  7. //使用Proxy返回一個(gè)對(duì)象。注意這里傳進(jìn)去的對(duì)象的對(duì)象必須實(shí)現(xiàn)一個(gè)接口

  8. public Object bind(Object obj) {   

  9.  

  10. this.orginalObject = obj;   

  11.  

  12. return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj   

  13.  

  14. .getClass().getInterfaces(), this);   

  15.  

  16. }   

  17.  

  18.  

  19.  

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

  21.  

  22. Object result = null;   

  23.  

  24. Throwable ex = null;   

  25.  

  26. InvokeJniInfo invInfo = new InvokeJniInfo(proxy,method,args,result,ex);   

  27.  

  28. log.debug("Invoking Before Intercepors!");   

//實(shí)現(xiàn)方法調(diào)用之前進(jìn)行攔截的方法

invokeInterceptorBefor(invInfo);     try{    log.debug("Invoking Proxy Method!");    //調(diào)用方法    result = method.invoke(orginalObject,args);     invInfo.setResult(result);    log.debug("Invoking After method!");

//實(shí)現(xiàn)方法調(diào)用之后進(jìn)行攔截的方法

invokeInterceptorAfter(invInfo);     }catch(Throwable tr){    invInfo.setException(tr);    log.error("Invoking exceptionThrow method!");

//實(shí)現(xiàn)出現(xiàn)異常進(jìn)行攔截的方法

invokeInterceptorExceptionThrow(invInfo);    }    return result;    }

//獲取攔截器列表

private synchronized List getIntercetors(){    if(null == interceptors){    interceptors = new ArrayList();

//添加日志記錄攔截器

interceptors.add(new LogInterceptor());

//添加初始化JavaBean攔截器

interceptors.add(new InitParamsInterceptor());

//如果需要添加其他功能,可以很方便的添加其他的攔截器實(shí)現(xiàn)功能

}    return interceptors;    }    private void invokeInterceptorBefor(InvokeJniInfo invInfo){    List interceptors = getIntercetors();    int len = interceptors.size();

//遍歷所有攔截器,并調(diào)用攔截器的before方法

for(int i = 0;i((Interceptor)interceptors.get(i)).before(invInfo);    }    }     private void invokeInterceptorAfter(InvokeJniInfo invInfo){    List interceptors = getIntercetors();    int len = interceptors.size();

//遍歷所有攔截器,并調(diào)用攔截器的after方法

for(int i = len - 1;i >= 0;i--){    ((Interceptor)interceptors.get(i)).after(invInfo);    }    }     private void invokeInterceptorExceptionThrow(InvokeJniInfo invInfo){    List interceptors = getIntercetors();    int len = interceptors.size();

//遍歷所有攔截器,并調(diào)用攔截器的exceptionThrow方法

for(int i = len - 1;i >= 0;i--){    ((Interceptor)interceptors.get(i)).exceptionThrow(invInfo);    }    }    }

7.獲取動(dòng)態(tài)代理對(duì)象工廠InterceptorFactory

public class InterceptorFactory {    private static Log log = LogFactory.getLog(InterceptorFactory.class);    public static Object getClassInstance(String clzName) {    Class cls;    Object obj = null;    try {    cls = Class.forName(clzName);    obj = (Object) cls.newInstance();    } catch (Exception e) {    log.error(e.getStackTrace());    }    return obj;    }    public static Object getInterceptorProxyedObject(String clzName) {    InterceptorHandler aopHandler = new InterceptorHandler();    Object obj = getClassInstance(clzName);    return aopHandler.bind(obj);    }    }     8.修改以前的代碼,使用動(dòng)態(tài)代理實(shí)現(xiàn)    public class SOAP{    private JniInterface jni = null;    private Log log = 。。。;    public SOAP(){    jni=(JniInterface)InterceptorFactory.getInterceptorProxyedObject("JniClass");    }     /**方法A**/    public JavaBeanA aMethod(JavaBeanA javaBeanA){    return jni.aMethod(javaBeanA);    }

看完上述內(nèi)容,你們對(duì)Java中怎么利用動(dòng)態(tài)代理實(shí)現(xiàn)AOP功能有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)站標(biāo)題:Java中怎么利用動(dòng)態(tài)代理實(shí)現(xiàn)AOP功能
網(wǎng)站鏈接:http://www.xueling.net.cn/article/jdshos.html

其他資訊

在線咨詢(xún)
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 免费国产A国产片高清网站 亚洲AV日韩AV男人的天堂在线 | 国产911情侣拍拍在线播放 | 蜜臀AV色欲A片无码精品一区 | 色婷婷久久 | 国产免费一区二区三区四区 | 孕妇仑乱A级毛片免费看 | 日本欧美一区二区三区在线播 | 成在人线AV无码免费高潮喷水 | 亚洲日韩AV无码中文 | 婷婷人人爽人人爽人人片 | 无码日韩av一区二区三区 | 不卡大片 | 美女内射无套日韩免费播放 | 精品无码久久午夜福利 | 亚洲精品久久久久久久久 | 欧美肥老妇视频 | 章节把亲妺妺强h怀孕小说 四虎免看黄 | 蜜桃狠狠狠狠狠狠 | 国产黄频免费高清视频 | 韩国19禁无遮挡啪啪无码网站 | 亚洲欧美日韩精品一区二区 | w两个世界完整免费观看超清完整 | 国内精品999 | 亚洲精品国产最新在线不卡 | 成人性生交A片免费看麻豆 欧美黑人巨大久久久精品一区小蓝 | 久久9国产偷伦 | 亚洲成人资源 | 初尝黑人巨砲波多野结衣 | 国产一级做a爰片久久真人片男 | 尤物AV无码国产在线观看 | 97涩国一产精品久久久久久久 | 一区二区不卡在线视频 | 国产精品久久久久7777婷婷 | 人人妻人人澡人人爽欧美一区 | 香蕉视频网站在线观看 | a毛片在线播放 | 日日躁夜夜躁白天躁晚上 | 亚洲精品入口 | 久久久老司机 | 日本在线免费视频 | 狠狠色综合TV久久久久久 |