返回顶部
首页 > 资讯 > 后端开发 > Python >Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)
  • 278
分享到

Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)

SpringAOPAOP代理机制JDK动态代理CGLib动态代理 2023-05-19 08:05:23 278人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录spring aop两种代理机制对比jdk动态代理CGLib动态代理SpringAOP两种代理原理SpringAOP代理JDK动态代理CGLIB代理两者对比使用注意总结Sprin

Spring AOP两种代理机制对比

Spirng的AOP的动态代理实现机制有两种,分别是:

JDK动态代理

具体实现原理:

1、通过实现InvocationHandlet接口创建自己的调用处理器

2、通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理

3、通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型

4、通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入

JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,

Spring通过java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。

CGLib动态代理

CGLib是一个强大、高性能的Code生产类库,可以实现运行期动态扩展java类,Spring在运行期间通过 CGlib继承要被动态代理的类,重写父类的方法,实现AOP面向切面编程呢。

两者对比:

JDK动态代理是面向接口,在创建代理实现类时比CGLib要快,创建代理速度快。

CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败),在创建代理这一块没有JDK动态代理快,但是运行速度比JDK动态代理要快。

使用注意:

如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制)

如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。

那么如何选择的使用代理机制了?

通过配置Spring的中<aop:config>标签来显示的指定使用动态代理机制 proxy-target-class=true表示使用CGLib代理,如果为false就是默认使用JDK动态代理

SpringAOP两种代理原理

  

SpringAOP代理

spingAOP代理有两种:

  • JDK动态代理:目标类必须实现一个接口
  • CGLIB代理:目标类必须继承一个类

JDK动态代理

JDK为什么一定要目标类实现一个接口呢,这其实就得看看JDK动态代理的原理了,其实JDK动态代理它是先生成一个代理类然后他也是实现了目标类实现的接口里面的方法,只是他还是调用的是目标类的方法。

下面我们来自定义实现一下

//创建一个接口
public interface StudentBiz {
    int add(String name);
    void update(String name);
    void find (String name);
}
//创建一个类实现那个接口
public class StudentBizimpl implements StudentBiz{
    @Override
    public int add(String name) {
        System.out.println("调用了studentBizimpl中的add"+name);
        return 100;
    }
    @Override
    public void update(String name) {
        System.out.println("调用了studentBizimpl中的update"+name);
    }
    @Override
    public void find(String name) {
        System.out.println("调用了studentBizimpl中的find"+name);
    }
}
//jdk动态代理三大重点
// 1.有目标类的引用
// 2.有一个创建代理实例的方法createProxy()里面有Proxy.newProxyInstance()方法来创建代理实例
// 3.有一个回调方法invoke
public class LogAspect implements InvocationHandler {
    private Object target;//目标类的对象
    public LogAspect(Object target){
        this.target=target;
    }
    public Object createProxy(){
        //新建一个代理实例
        //                           第一个参数是类加载器                        第二个是得获取到目标类实现的接口       第三个是代理类对象
        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(),this);
    }
    @Override//回调方法   当JVM调用代理对象的被代理的方法时,会由jvm自动调用这个invoke
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理类对象:"+proxy.getClass());
        System.out.println("目标的方法:"+method);
        System.out.println("方法的参数:"+args);
        log();//这里就可以加增强    具体哪些方法加得看切入点表达式来判断
        Object o=method.invoke(this.target,args);//激活目标类方法
        return o;
    }
    private void log(){
        System.out.println("前置增强");
    }
}

下面我们再来做一个测试类:

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        StudentBiz sbm=new StudentBizimpl();
        LogAspect la=new LogAspect(sbm);//放目标类对象
        Object o=la.createProxy();//创建一个代理类
        if (o instanceof StudentBiz){
            StudentBiz sb=(StudentBiz)o;
            sb.add("张三");//这里就会自动回调invoke方法
        }
    }
}

得到以下结果:

CGLIB代理

CGLib是一个强大、高性能的Code生产类库,可以实现运行期动态扩展java类,Spring在运行期间通过 CGlib继承要被动态代理的类,重写父类的方法,实现AOP面向切面编程呢。

CGLIB代理其实也就是生成一个代理对象他也继承了目标类的父类中的方法,再通过回调自身引用目标类的方法完成代理.

下面来简单地自定义实现一下

//做一个cglib代理类
public class LogAspectcglib implements MethodInterceptor {
    private Object target;
    public LogAspectcglib(Object target){
        this.target=target;
    }
    public Object createProxy(){
        Enhancer enhancer=new Enhancer();//用于生成代理对象
        enhancer.setSuperclass(this.target.getClass());//设置父类
        enhancer.setCallback(this);//设置回调用对象为本身
        return enhancer.create();//创建代理对象
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("代理类对象"+o.getClass());
        System.out.println("目标类的方法"+method);
        System.out.println("目标方法参数"+objects);
        System.out.println("要代理的方法"+methodProxy);
       Object returnvalue= method.invoke(this.target,objects);
        return returnvalue;
    }
}

测试类:

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        StudentBizimpl sbm=new StudentBizimpl();
        LogAspectcglib lac=new LogAspectcglib(sbm);
        Object o=lac.createProxy();
        if (o instanceof StudentBizimpl){
            StudentBizimpl sb=(StudentBizimpl) o;
            sb.add("张三");
        }
    }
}

得到结果:

两者对比

  • JDK动态代理是面向接口,在创建代理实现类时比CGLib要快,创建代理速度快。
  • CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败),在创建代理这一块没有JDK动态代理快,但是运行速度比JDK动态代理要快。

使用注意

如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制)

如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。

如果要强制使用CGLIB代理则需在xml中配置如下:

<aop:aspectj-autoproxy proxy-target-class="true"/>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)

本文链接: https://lsjlt.com/news/212651.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)
    目录Spring AOP两种代理机制对比JDK动态代理CGLib动态代理SpringAOP两种代理原理SpringAOP代理JDK动态代理CGLIB代理两者对比使用注意总结Sprin...
    99+
    2023-05-19
    Spring AOP AOP代理机制 JDK动态代理 CGLib动态代理
  • Spring中JDK和cglib动态代理原理的示例分析
    这篇文章给大家分享的是有关Spring中JDK和cglib动态代理原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java代理介绍Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及C...
    99+
    2023-06-02
  • 深入理解java动态代理的两种实现方式(JDK/Cglib)
    什么是代理模式?代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作。在代理类调用目标类的前后可以添加一些预处理和后处理操作来完成一些不属于目标类的功能。为什么要使用代理模式?通过代理模式可以实现对...
    99+
    2023-05-31
    cglib jdk java
  • Java CGLib动态代理机制(全面解析)
    一、首先说一下JDK中的动态代理:JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的但是,JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编...
    99+
    2023-05-31
    java 动态代理 cglib
  • Spring细数两种代理模式之静态代理和动态代理概念及使用
    目录代理模式1、静态代理2、动态代理代理模式 在学习 AOP 之前,我们先来了解下代理模式, 代理模式分为静态代理以及动态代理,属于23中设计模式之一。 AOP 的底层机制就是动态代...
    99+
    2023-02-27
    Spring静态代理与动态代理 Spring静态代理 Spring动态代理
  • Spring中AOP概念与两种动态代理模式原理详解
    目录1.概念1.AOP技术简介2.AOP的优势3.Spring AOP术语4.AOP 开发明确的事项 2.AOP底层实现1.AOP 的动态代理技术:3.基于cglib的动态...
    99+
    2024-04-02
  • 解析动态代理jdk的Proxy与spring的CGlib(包括区别介绍)
    目录1. 为什么要使用动态代理?2.JDK Proxy 动态代理面向接口的动态代理3.CGlib动态代理原理区别:两个动态代理的区别1. 为什么要使用动态代理? 动态代理:在不改变原...
    99+
    2024-04-02
  • 深度剖析java中JDK动态代理机制
    摘要相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。代理模式使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用...
    99+
    2023-05-31
    jdk 动态代理 ava
  • Java中反射机制和动态代理的示例分析
    这篇文章主要介绍了Java中反射机制和动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、反射概述反射机制指的是Java在运行时候有一种自观的能力,能够了解自...
    99+
    2023-06-15
  • Java反射机制中动态代理的示例分析
    这篇文章主要介绍了Java反射机制中动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 代理模式代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作