亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

springAOP的兩種代理

2019-11-14 15:20:27
字體:
來源:轉載
供稿:網友

本篇記錄下sPRing AOP的兩種代理,為下一篇AOP實現做下鋪墊。

1.JDK動態代理  2.cglib代理

1、如果目標對象實現了接口,默認情況下會采用JDK的動態代理實現AOP
2、如果目標對象實現了接口,可以強制使用CGLIB實現AOP
3、如果目標對象沒有實現了接口,必須采用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換

:JDK動態代理要比cglib代理執行速度快,但性能不如cglib好。所以在選擇用哪種代理還是要看具體情況,一般單例模式用cglib比較好,具體原因請自行百度。

一。JDK動態代理實現(原理是使用反射機制)

首先定義接口,并實現

      public interface TestService{

           public int add();   
      }

      public class TestServiceImpl implements TestService{

         @Override
         public int add() {
            System.out.println("開始執行add...");
            return 0;
         }
     }

 

定義代理類,這里要注意導入的包是import java.lang.reflect.*

   public class JDKDynamicProxy implements InvocationHandler {

     //被代理的目標對象
    private Object proxyObj;  
   
    /**
      * Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
      * loader    :類加載器 一個ClassLoader對象,定義了由哪個ClassLoader對象來對生成的代理對象進行加載
      * interfaces:一個Interface對象的數組,表示的是我將要給我需要代理的對象提供一組什么接口,如果我提供了一組接口給它,那么這個代理對象就宣稱實現了該接口(多態),這樣我就能調用這組接口中的方法了
       * h         :一個InvocationHandler對象,表示的是當我這個動態代理對象在調用方法的時候,會關聯到哪一個InvocationHandler對象上
     */
       public Object newProxy(Object proxyObj){  
             this.proxyObj = proxyObj;
            //返回一個代理對象  
           return Proxy.newProxyInstance(proxyObj.getClass().getClassLoader(),   
                                      proxyObj.getClass().getInterfaces(),   
                                      this);  
       }  

      /**
       * 執行目標對象
       * Object  proxy:被代理的對象
       * Method  method:要調用的方法
       * Object  args[]:方法調用時所需要的參數
       */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                                   throws Throwable {      
             before();
             Object object = method.invoke(this.proxyObj,args);  // 通過反射機制調用目標對象的方法
             after();      
             return object;  
         }
    
         public void before(){
              System.out.println("開始執行目標對象之前...");
         }
    
         public void after(){
             System.out.println("開始執行目標對象之后...");
         }
     }

測試類:

      public static void main(String[] args) {
        
          //我們要代理的真實對象
          TestService testService = new TestServiceImpl();       
          //testJDKProxyService.add();//不是用代理   
        
         JDKDynamicProxy JDKDynamicProxyTarget = new JDKDynamicProxy();
         TestService testServiceProxy = (TestService) JDKDynamicProxyTarget.newProxy(testService);
         //執行代理類的方法  
         testServiceProxy.add();

     }

控制臺顯示

   

 

二。CGLIB代理,需要導入 cglib-nodep-2.1_3.jar

    先說下cglib,CGlib是一個強大的,高性能,高質量的Code生成類庫。它可以在運行期擴展Java類與實現Java接口。

先定義一個實現類(注意并沒有實現接口)

  public class TestCGLIBServiceImpl {

    public int add() {
        System.out.println("開始執行add...");
        return 0;
    }
 }

定義cglib代理類,此時導入的包應該是import net.sf.cglib.proxy.*

  import java.lang.reflect.Method;
  import net.sf.cglib.proxy.Enhancer;
  import net.sf.cglib.proxy.MethodInterceptor;
  import net.sf.cglib.proxy.MethodProxy;

    public class CGLIBProxy implements MethodInterceptor{

    private Object targetObject ;//被代理的目標對象
    
    public Object createProxyInstance(Object targetObject) {

           this . targetObject = targetObject;

           Enhancer enhancer = new Enhancer();

           enhancer.setSuperclass(targetObject.getClass());// 設置代理目標

           enhancer.setCallback( this );// 設置回調

           return enhancer.create();

    }
    

    /**
     * 在代理實例上處理方法調用并返回結果
     * @param object : 代理類
     * @param method :被代理的方法
     * @param args :該方法的參數數組
     * @param methodProxy
     */
    @Override
    public Object intercept(Object object, Method method, Object[] args,
            MethodProxy methodproxy) throws Throwable {       
        Object result = null;    
        try {
              System. out .println( "前置處理開始 ..." );
              result = methodproxy.invoke( targetObject , args);//執行目標對象的方法
              System. out .println( "后置處理開始  ..." );
           } catch (Exception e) {
               System. out .println( " 異常處理 ..." );
           } finally {
               System. out .println( " 調用結束 ..." );
           }
           return result;
       }  
   }
測試類:

   public class TestCGLIBProxy {

        public static void main(String[] args) {
        
          //我們要代理的真實對象
          TestCGLIBServiceImpl testCGLIB = new TestCGLIBServiceImpl();
           CGLIBProxy CGLIBproxy = new CGLIBProxy();
           TestCGLIBServiceImpl testCGLIBProxy = (TestCGLIBServiceImpl) CGLIBproxy.createProxyInstance(testCGLIB);
           testCGLIBProxy.add();
       }
   }

結果圖:

  

寫在后面:spring AOP的兩種代理實現代碼就寫到這,這里只是實現了,如果你要想真正明白,還得熟悉其中原理機制,比如反射機制,newProxyInstance(...),Enhancer()原理,invoke()原理等等。

下一篇將要記錄spring AOP的基于注解的具體實現,而對于xml的我姑且不是用了,因為不夠靈活,不夠強大,要是有時間還會介紹下spring AOP 自定義注解的實現

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美综合区自拍另类| 国产精品久久一| 91视频国产高清| 成人免费视频在线观看超级碰| 国产精品黄色影片导航在线观看| 亲子乱一区二区三区电影| 日韩在线视频观看正片免费网站| 91精品啪在线观看麻豆免费| 欧美一级大片视频| 懂色av中文一区二区三区天美| 亚洲国产高清福利视频| 中文字幕国产亚洲2019| 国产精品第七十二页| 亚洲自拍偷拍色片视频| 国产精品久久久一区| 高清视频欧美一级| 成人午夜两性视频| 久久色在线播放| 91系列在线播放| 色综久久综合桃花网| 欧美大片免费观看| 国产精品久在线观看| 成人黄色免费在线观看| 久久综合久久美利坚合众国| 一区二区三区无码高清视频| 亚洲性无码av在线| 国产精品麻豆va在线播放| 久久91亚洲精品中文字幕奶水| 黄色精品在线看| 国产综合香蕉五月婷在线| 久久精品国产一区| 欧美大学生性色视频| 欧美精品免费播放| 日韩一区二区欧美| 久久人人爽人人爽人人片av高清| 欧美一区二区大胆人体摄影专业网站| 91免费视频网站| 日韩电影视频免费| 亚洲一区第一页| 国产日韩欧美在线| 久久亚洲欧美日韩精品专区| 成人av在线天堂| 国产一区二区三区丝袜| 国产69精品久久久久久| 久久伊人精品天天| 欧美成人精品不卡视频在线观看| 亚洲午夜小视频| 精品国内产的精品视频在线观看| 亚洲美女性生活视频| 亚洲黄色av女优在线观看| 亚洲japanese制服美女| 欧美日韩中文字幕在线视频| 大胆人体色综合| 国产精品久久久久久久av电影| 日韩电影免费在线观看中文字幕| 亚洲免费一级电影| 欧美性高跟鞋xxxxhd| 精品国偷自产在线| 国产成人亚洲综合青青| 色悠悠久久88| 欧美激情中文字幕乱码免费| 97**国产露脸精品国产| 久久91亚洲精品中文字幕| 国产精品电影一区| 亚洲人成电影网站色…| 亚洲精品国产拍免费91在线| 欧美视频二区36p| 热久久美女精品天天吊色| 国产成人精品久久二区二区91| 一区二区欧美日韩视频| 2019中文字幕全在线观看| 日本欧美在线视频| 国产成人综合精品在线| 久久久精品网站| 午夜精品久久久久久久99黑人| 欧美做受高潮电影o| 欧美成人免费全部| 日韩欧美一区二区三区| 国产精品av在线| 精品人伦一区二区三区蜜桃网站| 亚洲爱爱爱爱爱| 国产精品女人久久久久久| 97人人爽人人喊人人模波多| 欧美亚洲另类在线| 欧美又大又硬又粗bbbbb| 欧美一区二区三区免费视| 精品久久香蕉国产线看观看gif| 欧美壮男野外gaytube| 亚洲人成在线观看| 国产精品热视频| 日韩精品在线电影| 亚洲电影天堂av| 国产精品成人一区| 国产日韩欧美中文在线播放| 亚洲一区www| 久久男人av资源网站| 色综合导航网站| 中文字幕欧美日韩| 91免费视频网站| 91av在线看| 久久久久国产精品免费网站| 欧美一区二区三区免费观看| 成人免费激情视频| 日韩在线观看电影| 精品调教chinesegay| 国产精品久久久久久久久男| 九九热这里只有精品6| 国产精品欧美一区二区三区奶水| 人九九综合九九宗合| 97超级碰碰人国产在线观看| 国产精品旅馆在线| 高跟丝袜一区二区三区| 国产一区二区在线播放| 欧美成在线观看| 国产亚洲精品va在线观看| 97精品国产97久久久久久春色| 91色琪琪电影亚洲精品久久| www国产精品com| 色偷偷噜噜噜亚洲男人的天堂| 亚洲国产精品热久久| 91成人性视频| 精品精品国产国产自在线| 日韩欧美在线视频日韩欧美在线视频| 国产精品国产自产拍高清av水多| 亚洲v日韩v综合v精品v| 亚洲国产天堂久久综合网| 欧美在线播放视频| 91精品国产91久久久久久| 亚洲一区二区久久久久久久| 黄网站色欧美视频| 国产欧美亚洲视频| 成人午夜一级二级三级| 欧美日韩中国免费专区在线看| 国内久久久精品| 成人黄色免费在线观看| 国产精品视频公开费视频| 91免费版网站入口| 啪一啪鲁一鲁2019在线视频| 国产精品扒开腿做爽爽爽视频| 色婷婷综合久久久久中文字幕1| 久久免费视频这里只有精品| 国产香蕉精品视频一区二区三区| 精品久久久久久久久国产字幕| 久久久久久久影院| 亚洲色图17p| 亚洲色图色老头| 久久成人免费视频| 狠狠色狠狠色综合日日五| 久久久久久亚洲| 中文字幕日韩综合av| 美女视频久久黄| 91中文字幕在线观看| 亚洲人成网站色ww在线| 亚洲国产中文字幕在线观看| 亚洲三级av在线| 久久亚洲国产精品| 久久精品人人爽| 亚洲无亚洲人成网站77777| 菠萝蜜影院一区二区免费| 亚洲国产毛片完整版| 亚洲精品456在线播放狼人| 精品国产精品三级精品av网址| 国产亚洲精品久久久久久| 理论片在线不卡免费观看|