最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring cglib 與 jdk 動(dòng)態(tài)代理

 更新時(shí)間:2017年05月02日 16:11:20   作者:fangfan  
本篇文章主要介紹了spring cglib與jdk動(dòng)態(tài)代理的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧

1. 概述

JDK動(dòng)態(tài)代理是利用java反射機(jī)制 生成一個(gè)實(shí)現(xiàn)接口的匿名類, 在調(diào)用具體方法前調(diào)用InvocationHandler來處理

Cglib動(dòng)態(tài)代理是 利用asm開源包 把被代理類的class文件加載進(jìn)來 通過修改其字節(jié)碼生成子類來處理  

如果目標(biāo)對象實(shí)現(xiàn)了接口 那么默認(rèn)使用jdk代理(可以強(qiáng)制使用cglib代理)

如果沒有實(shí)現(xiàn)接口 必須使用cglib代理

強(qiáng)制使用cglib代理需要

  *引入cglibjar包

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

cglib因?yàn)槭莿?dòng)態(tài)生成被代理類的子類 并覆蓋被代理類的方法 來實(shí)現(xiàn)的 所以 被代理方法不要使用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("增強(qiáng)前 ... Cglib");
        Object invoke = method.invoke(service, arg2);
        System.out.println("增強(qiáng)后 ... Cglib");
        return invoke;
      }});
    UserService userService = (UserService) hancer.create();
    userService.sayHello();

  }
}
//需要引入cglib-2.2.jar 和org.objectweb.asm-3.3.1.jar 
//輸出
//增強(qiáng)前 ... Cglib
//this userService works....
//增強(qiáng)后 ... 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("增強(qiáng)前...jdk");
            Object invoke = method.invoke(service, args);
            System.out.println("增強(qiáng)后...jdk");
            return invoke;
          }
        });
    actorService.sayHi();
  }
}
//增強(qiáng)前...jdk
//Honestly, I do the work.
//增強(qiáng)后...jdk

被代理接口及實(shí)現(xiàn)類

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.");
  }
}

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • RabbitMQ中的prefetch_count參數(shù)詳解

    RabbitMQ中的prefetch_count參數(shù)詳解

    這篇文章主要介紹了RabbitMQ中的prefetch_count參數(shù)用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 解讀maven項(xiàng)目的打包方式

    解讀maven項(xiàng)目的打包方式

    這篇文章主要介紹了關(guān)于maven項(xiàng)目的打包方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 在Spring異步調(diào)用中傳遞上下文的方法

    在Spring異步調(diào)用中傳遞上下文的方法

    這篇文章主要給大家介紹了關(guān)于如何在Spring異步調(diào)用中傳遞上下文的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 關(guān)于SpringBoot打包測試、生產(chǎn)環(huán)境方式

    關(guān)于SpringBoot打包測試、生產(chǎn)環(huán)境方式

    這篇文章主要介紹了關(guān)于SpringBoot打包測試、生產(chǎn)環(huán)境方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • javascript checkbox全選和反選的簡單實(shí)現(xiàn)

    javascript checkbox全選和反選的簡單實(shí)現(xiàn)

    這篇文章主要介紹了javascript checkbox全選和反選的簡單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • spring如何通過FactoryBean配置Bean

    spring如何通過FactoryBean配置Bean

    這篇文章主要介紹了spring如何通過FactoryBean配置Bean,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java常見問題之javac Hello.java找不到文件的解決方法

    Java常見問題之javac Hello.java找不到文件的解決方法

    剛開始編寫java代碼時(shí),肯定會(huì)遇到各種各樣的bug,當(dāng)然對于初學(xué)者這也是能理解的,下面這篇文章主要給大家介紹了關(guān)于Java常見問題之javac Hello.java找不到文件解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01
  • Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析實(shí)例詳解

    Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析實(shí)例詳解

    這篇文章主要介紹了Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析,結(jié)合實(shí)例形式詳細(xì)分析了Java基于二分搜索樹、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項(xiàng)目)

    SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項(xiàng)目)

    這篇文章主要介紹了SpringBoot使用過濾器、攔截器和監(jiān)聽器(Springboot搭建java項(xiàng)目),本文是基于Springboot搭建java項(xiàng)目,結(jié)合案例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02

最新評論

太白县| 万年县| 三亚市| 富平县| 茂名市| 阳西县| 独山县| 蚌埠市| 井研县| 日喀则市| 禹城市| 大英县| 开封县| 英山县| 达拉特旗| 武义县| 镇沅| 温泉县| 九台市| 盐池县| 奎屯市| 侯马市| 青龙| 台江县| 卓资县| 泸州市| 长葛市| 丁青县| 大同市| 石阡县| 三原县| 卓资县| 雷山县| 任丘市| 黄浦区| 从江县| 沂水县| 内江市| 佛坪县| 延安市| 留坝县|