91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

昆明市| 察雅县| 翼城县| 通榆县| 岑巩县| 佛冈县| 濮阳县| 江永县| 缙云县| 贞丰县| 青浦区| 茂名市| 德保县| 佛教| 清水河县| 祁阳县| 仁寿县| 米林县| 潼南县| 苍梧县| 沙坪坝区| 共和县| 突泉县| 鄂尔多斯市| 沙湾县| 方正县| 图木舒克市| 偏关县| 孝感市| 凤台县| 陆丰市| 梁河县| 漳浦县| 三原县| 阿鲁科尔沁旗| 石嘴山市| 荆州市| 航空| 华蓥市| 乌拉特前旗| 新源县|