spring中的动态代理

2023-11-03

两种代理原理

jdk动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

spring对代理的选择

  1. 如果目标类实现了接口,默认情况下会采用JDK的动态代理实现AOP
  2. 如果目标类实现了接口,可以强制使用CGLIB实现AOP
  3. 如果目标类没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

JDK动态代理和CGLIB字节码生成的区别?

  1. JDK动态代理需要目标类实现接口
  2. CGLIB是针对类实现代理,主要是对指定的类生成子类,覆盖其中的方法
    因为是继承,所以该类或方法最好不要声明成final
  3. CGLIB性能更好

JDK动态代理实现

定义目标类的接口

public interface business {
    void execute();
}

目标类实现接口

public  class businessIml implements business {
    public void execute() {
        System.out.println("业务处理");
    }
}

代理类

public class businessInvacationHandler implements InvocationHandler {
    private Object target;

    //proxy指代理的对象,method指代理对象的某个方法,args指该方法接受的参数
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("业务处理前");
        Object result = method.invoke(target, args);
        System.out.println("业务处理后");
        return result;
    }

    /*  loader:  一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
        interfaces:  一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,
        如果我提供了一组接口给它,
        那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
        h:  一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上*/
    public Object getProxy(Object object) {
        this.target=object;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
}

public static void main(String[] args) {
        businessIml businessIml = new businessIml();
        business proxy = (business)new businessInvacationHandler().getProxy(businessIml);
        proxy.execute();
    }

CGLIB 代理实现

引入依赖

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>

代理类

public class BusinessProxy implements MethodInterceptor {
    
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("业务处理前");
        Object result = methodProxy.invokeSuper(o, args);
        System.out.println("业务处理后");
        return result;
    }

    public Object getProxy(Class<?> clazz) {
        Enhancer enhancer = new Enhancer();//用于创建子类
        enhancer.setSuperclass(clazz);//设置父类
        enhancer.setCallback(this);//回调方法的参数为代理类对象BusinessProxy
        // ,最后增强目标类调用的是代理类对象BusinessProxy中的intercept方法
        return enhancer.create();
    }

}
public static void main(String[] args) {
        businessIml proxy = (businessIml) new BusinessProxy().
        												getProxy(businessIml.class);
        proxy.execute();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring中的动态代理 的相关文章

随机推荐

  • JavaSE 01

    JAVASE 学习1 作为初学者 主要在此记录学习过程中的点滴 以供参考和后期回顾 1 Java是一个全面且功能强大的语言 可用于多种用途 Java有三个版本 Java标准版 Java Standard Edition Java SE 可以
  • 手把手教你用VS2019搭建Linux开发环境

    因为linux的界面还是不如Windows友好 但是linux系统下可以看见一些更底层的东西 今天 我来教你用vs2019搭建linux项目 第一步 打开vs的安装器 看下面标注的组件是否安装 第二步 开启linux ssh服务 ubunt
  • Android Studio连接夜神模拟器

    Android Studio连接夜神模拟器 一 下载夜神模拟器 二 夜神模拟器连接Android Studio 三 其他操作 3 1 屏幕旋转 3 2 创建其他模拟器 一 下载夜神模拟器 官网 https www yeshen com 下载
  • TCP如何保证可靠传输

    TCP如何保证可靠传输 TCP保证可靠传输的方式有 校验和 序列号 确认应答 超时重传 连接管路 流量控制 拥塞控制等 1 校验和 在数据传输过程中 吧传输的数据当作一个16位整数 吧所有的数据加起来 最前面的进位补到最后一位 然后取反得到
  • 钱币兑换问题(dp背包)

    钱币兑换问题 在一个国家仅有1分 2分 3分硬币 将钱N兑换成硬币有很多种兑法 请你编程序计算出共有多少种兑法 Input 每行只有一个正整数N N小于32768 Output 对应每个输入 输出兑换方法数 Sample Input 293
  • 观察者模式(推模型+拉模型)

    观察者模式 Observer Pattern 当一个对象被修改时 会自动通知它的依赖对象 现在我们是新闻社 要向所有新闻订阅者推送新闻 那么该如何实现呢 经过思考我们不难发现一家新闻社一般对应的是多个新闻订阅者 那么我们先从新闻社开始入手
  • 同步和异步的区别及优缺点 通俗理解

    一 同步和异步的区别 程序里面的同步和异步和我们现实生活理解不太一样 一般我们对同步的理解是同时做很多事情 但程序中的同步是按照任务的顺序执行任务 前一个任务没有执行结束 下一个任务不会执行 要等待上一个任务执行结束 通俗举例 我大学有个室
  • 服务器同时读写多个文件,多服务器文件读写

    多服务器文件读写 内容精选 换一换 表1列出了弹性文件服务的常用功能 在使用弹性文件服务之前 建议您先通过常用概念介绍了解NFS CIFS等基本概念 以便更好地理解弹性文件服务提供的功能 表示该类型的文件系统支持该功能 表示该类型的文件系统
  • angular项目从部署到启动

    angular是前端三大框架之一 适合开发大型需要多人合作的项目 代码规范 社区活跃 不过学习曲线陡峭 这篇介绍环境搭建 完成就可以启动ng项目了 一 Node js和npm 在node官网 https nodejs org zh cn d
  • Java实战之城市多音字处理

    Java实战之城市多音字处理 一 需求 对城市名称转化为拼音的时候 当遇到多音字城市的时候 转化拼音就不是我们想要的了 使用 pinyin4j 无法直接解决这个问题 网上有很多维护多音字信息的 觉得麻烦 如 长沙 gt zhangsha 厦
  • Massif:堆分析器

    简介 Massif是一个堆分析器 它度量程序使用了多少堆内存 这包括有用的空间 以及分配给簿记和对齐目的的额外字节 它还可以测量程序堆栈的大小 尽管默认情况下它不这样做 堆分析可以帮助您减少程序使用的内存量 在具有虚拟内存的现代机器上 这提
  • 人工智能如何理解开悟?

    马斯克为啥牛逼你知道吗 为啥现能成世界首富 你们知不知道 最近这一个月全世界最火的连比尔盖茨都说了 这个是比当年人类发明互联网更加震撼人心的 就是马斯克有一家公司发明了一个聊天机器人 叫track GDP 这个track GDP有多厉害呢
  • 现在的jdk keytool无法获取到jks的MD5怎么办?

    一 使用其他版本的JDK 可获取MD5的版本 https ask dcloud net cn article 38778 二 使用openssl 获取 命令如下 keytool exportcert keystore xxx keystor
  • qt 5.12.1 下载安装详细教程

    前言 Qt是一个跨平台的C 图形界面应用程序框架 它提供给开发者建立图形用户界面所需的功能 广泛用于开发GUI程序 也可用于开发非GUI程序 Qt很容易扩展 并且允许真正地组件编程 基本上 Qt同X Window上的Motif Openwi
  • 几种字符串补“0”(或其它字符)的方式

    几种字符串补 0 或其它字符 的方式 好记性不如烂笔头 先记下 呵呵 方式一 这个最多程序员用的 也是最普通的方式 int a 656 string b a if b length lt 6 for int i 0 i lt 6 b len
  • 参数在信号-槽参数用值传递还是引用传递

    结论 以下表格总结了我们的结果 例如第一行 如果程序传递信号的参数为引用到槽 那么在直接连接则不发生复制 在队列连接则发生一次复制 Signal Slot Direct Queued const Copy const Copy 0 1 co
  • Matlab找出矩阵每一行的最大值及其位置

    dis max arr 2 dis array zeros M N for i 1 size dis hang max dis i 1 c find edtImage i hang max dis array i c 1 end figur
  • 移植NTP时间同步工具到arm linux平台创建定时任务

    移植NTP时间同步工具到arm linux平台创建定时任务 下载源码 解压并编译 一个脚本进行编译 上传文件至开发板 运行 创建开机启动项 注意在windows上编写的文件可能需要执行以下命令 ntp服务器 下载源码 wget c http
  • (ubuntu)linux和mac安装Miracl密码库

    只要你按照以下步骤操作 可以得到Miracl密码库的静态编译文件 a 步骤一 官网仓库 注意 是下载ZIP 而不是直接clone下来 不然的话是绝对不行的 步骤二 unzip j aa L MIRACL master zip 执行命令 终端
  • spring中的动态代理

    两种代理原理 jdk动态代理是利用反射机制生成一个实现代理接口的匿名类 在调用具体方法前调用InvokeHandler来处理 cglib动态代理是利用asm开源包 对代理对象类的class文件加载进来 通过修改其字节码生成子类来处理 spr