spring cglib 与 jdk 动态代理

 更新时间:2017年05月02日 16:11:20   作者:fangfan  
本篇文章主要介绍了spring cglib与jdk动态代理的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • RabbitMQ中的prefetch_count参数详解

    RabbitMQ中的prefetch_count参数详解

    这篇文章主要介绍了RabbitMQ中的prefetch_count参数用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 解读maven项目的打包方式

    解读maven项目的打包方式

    这篇文章主要介绍了关于maven项目的打包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 在Spring异步调用中传递上下文的方法

    在Spring异步调用中传递上下文的方法

    这篇文章主要给大家介绍了关于如何在Spring异步调用中传递上下文的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 关于SpringBoot打包测试、生产环境方式

    关于SpringBoot打包测试、生产环境方式

    这篇文章主要介绍了关于SpringBoot打包测试、生产环境方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • javascript checkbox全选和反选的简单实现

    javascript checkbox全选和反选的简单实现

    这篇文章主要介绍了javascript checkbox全选和反选的简单实现的相关资料,需要的朋友可以参考下
    2017-05-05
  • spring如何通过FactoryBean配置Bean

    spring如何通过FactoryBean配置Bean

    这篇文章主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • SpringBoot采用Dynamic-Datasource方式实现多JDBC数据源

    SpringBoot采用Dynamic-Datasource方式实现多JDBC数据源

    在某些情况下,如果我们需要配置多个数据源,本文主要介绍了SpringBoot采用Dynamic-Datasource方式实现多JDBC数据源,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java常见问题之javac Hello.java找不到文件的解决方法

    Java常见问题之javac Hello.java找不到文件的解决方法

    刚开始编写java代码时,肯定会遇到各种各样的bug,当然对于初学者这也是能理解的,下面这篇文章主要给大家介绍了关于Java常见问题之javac Hello.java找不到文件解决的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下。
    2018-01-01
  • Java基于二分搜索树、链表的实现的集合Set复杂度分析实例详解

    Java基于二分搜索树、链表的实现的集合Set复杂度分析实例详解

    这篇文章主要介绍了Java基于二分搜索树、链表的实现的集合Set复杂度分析,结合实例形式详细分析了Java基于二分搜索树、链表的实现的集合Set复杂度分析相关操作技巧与注意事项,需要的朋友可以参考下
    2020-03-03
  • SpringBoot使用过滤器、拦截器和监听器的案例代码(Springboot搭建java项目)

    SpringBoot使用过滤器、拦截器和监听器的案例代码(Springboot搭建java项目)

    这篇文章主要介绍了SpringBoot使用过滤器、拦截器和监听器(Springboot搭建java项目),本文是基于Springboot搭建java项目,结合案例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02

最新评论