中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring cglib 與 jdk 動態代理

發布時間:2020-09-01 06:55:58 來源:腳本之家 閱讀:162 作者:fangfan 欄目:編程語言

1. 概述

JDK動態代理是利用java反射機制 生成一個實現接口的匿名類, 在調用具體方法前調用InvocationHandler來處理

Cglib動態代理是 利用asm開源包 把被代理類的class文件加載進來 通過修改其字節碼生成子類來處理  

如果目標對象實現了接口 那么默認使用jdk代理(可以強制使用cglib代理)

如果沒有實現接口 必須使用cglib代理

強制使用cglib代理需要

  *引入cglibjar包

  *配置spring <aop:aspectj-autoproxy proxy-target-class="true"/>    

cglib因為是動態生成被代理類的子類 并覆蓋被代理類的方法 來實現的 所以 被代理方法不要使用final修飾   

2. 代碼示例

2.1 cglib代理類

package com.rocky.spring;

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 {

  public static void main(String[] args) {
    final UserService service = new UserService();
    Enhancer hancer = new Enhancer();
    hancer.setSuperclass(service.getClass());
    hancer.setCallback(new MethodInterceptor(){

      @Override
      public Object intercept(Object proxy, Method method, Object[] arg2,
          MethodProxy arg3) throws Throwable {
        System.out.println("增強前 ... Cglib");
        Object invoke = method.invoke(service, arg2);
        System.out.println("增強后 ... Cglib");
        return invoke;
      }});
    UserService userService = (UserService) hancer.create();
    userService.sayHello();

  }
}
//需要引入cglib-2.2.jar 和org.objectweb.asm-3.3.1.jar 
//輸出
//增強前 ... Cglib
//this userService works....
//增強后 ... Cglib

被代理類UserService

package com.rocky.spring;

public class UserService {

  public void sayHello(){
    System.out.println("this userService works....");
  }
}

2.2 jdk代理接口

package com.rocky.spring;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxy {

  public static void main(String[] args) {
    final ActorService service = new ActorServiceImpl();
    ActorService actorService = (ActorService) Proxy.newProxyInstance(
        service.getClass().getClassLoader(), service.getClass()
            .getInterfaces(), new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method,
              Object[] args) throws Throwable {
            System.out.println("增強前...jdk");
            Object invoke = method.invoke(service, args);
            System.out.println("增強后...jdk");
            return invoke;
          }
        });
    actorService.sayHi();
  }
}
//增強前...jdk
//Honestly, I do the work.
//增強后...jdk

被代理接口及實現類

package com.rocky.spring;
public interface ActorService {
  public void sayHi();
}
-----------------
package com.rocky.spring;
public class ActorServiceImpl implements ActorService {

  @Override
  public void sayHi() {
    doSomething();
  }

  private void doSomething() {
    System.out.println("Honestly, I do the work.");
  }
}

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永春县| 洛阳市| 济阳县| 丽江市| 红河县| 浦东新区| 哈尔滨市| 满洲里市| 河东区| 南康市| 萨嘎县| 昔阳县| 夏津县| 临武县| 腾冲县| 乌苏市| 抚松县| 榆树市| 苍南县| 闽侯县| 东台市| 嵊泗县| 松原市| 手游| 仲巴县| 叙永县| 潮安县| 嵊州市| 阿坝| 乌恰县| 益阳市| 嘉荫县| 汽车| 九寨沟县| 建瓯市| 久治县| 永安市| 张家界市| 乡宁县| 沂源县| 富顺县|