aop默认代理方式是什么

2023-11-02

jdk代理,可以通过proxy-target-class修改
proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。

如果proxy-target-class 属性值被设置为true,那么基于类的代理将起作用(这时需要cglib库)。

如果proxy-target-class属值被设置为false或者这个属性被省略,那么标准的JDK 基于接口的代理。

如果不给出 proxy-target-class,就按 proxy-target-class=“false”对待,也即是按JDK proxy来处理的。

一 JDK和CGLIB动态代理原理

JDK动态代理:

利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,

在调用具体方法前调用InvokeHandler来处理。

CGLiB动态代理:

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

何时使用JDK还是CGLiB?

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。

2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP。

3、如果目标对象没有实现了接口,必须采用CGLIB库,Spring会自动在JDK动态代理和CGLIB之间转换。

如何强制使用CGLIB实现AOP?

1、添加CGLIB库(aspectjrt-xxx.jar、aspectjweaver-xxx.jar、cglib-nodep-xxx.jar)

2、在Spring配置文件中加入

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

1、JDK动态代理只能对实现了接口的类生成代理,而不能针对类。

2、CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,

 并覆盖其中方法实现增强,但是因为采用的是继承,所以该类或方法最好不要声明成final,

 对于final类或方法,是无法继承的。

CGlib比JDK快?

1、使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,

在jdk6之前比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,

因为CGLib原理是动态生成被代理类的子类。

2、在jdk6、jdk7、jdk8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLIB代理效率,

只有当进行大量调用的时候,jdk6和jdk7比CGLIB代理效率低一点,但是到jdk8的时候,jdk代理效率高于CGLIB代理,

总之,每一次jdk版本升级,jdk代理效率都得到提升,而CGLIB代理消息确有点跟不上步伐。

Spring如何选择用JDK还是CGLiB?

1、当Bean实现接口时,Spring就会用JDK的动态代理。

2、当Bean没有实现接口时,Spring使用CGlib是实现。

3、可以强制使用CGlib(在spring配置中加入)。

三 JDK和CGLIB动态代理总结

JDK代理是不需要第三方库支持,只需要JDK环境就可以进行代理,使用条件:

1、实现InvocationHandler

2、使用Proxy.newProxyInstance产生代理对象

3、被代理的对象必须要实现接口

CGLib必须依赖于CGLib的类库,但是它需要类来实现任何接口代理的是指定的类生成一个子类,

覆盖其中的方法,是一种继承但是针对接口编程的环境下推荐使用JDK的代理;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

aop默认代理方式是什么 的相关文章

随机推荐

  • PMSM FOC位置环S曲线控制算法(恒定急动度)

    文章目录 一 原理 二 代码 之前做FOC位置环控制的时候 简单地加了一个S曲线控制 参考链接如下 FOC 单电阻采样 位置环控制伺服电机 这里面代码实现其实就是在每step个ADC中断中 根据函数 f x
  • 对一个文件夹下的图片进行批量缩放(resize)处理

    文章目录 问题背景 环境配置 完整代码 代码解释 另一种更简单的写法 问题背景 使用GPU训练时 有时出现了图片太大 导致处理起来速度慢或内存不够崩掉的情况 因此需要对原图片进行缩放 本文介绍了批量处理的方法 成功将一个文件下的所有图片 较
  • this.$router.go(0)的作用

    this router go val gt 在history记录中前进或者后退val步 当val为0时刷新当前页面
  • 使用mathjax解析公式

    mathjax解析公式 uniapp使用mathjax 在app vue里面动态引入mathjax const script document createElement script MathJax地址 config参数不可忽略 scri
  • Raft 一致性算法论文译文

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译 论文名为 In search of an Understandable Consensus Algorithm Extended Version 寻找一种易于理解的一致性算法 Raft
  • 《Windows核心编程》---堆管理函数

    Windows的 堆 分为默认堆和私有堆两种 默认堆是在程序初始化时由操作系统自动创建的 所有标准内存管理函数都是在默认堆中申请内存的 而私有堆相当于在默认堆中保留了一大块内存 用堆管理函数可以在这个保留的内存区域中分配内存 一个进程的默认
  • LabVIEW 可配置正交频分复用软件定义无线电收发器

    OFDM 正交频分复用 是使用大量具有谐波频率间隔的调制载波并行传输数据的技术 从而使载波彼此正交 正交性允许以后可以分离的通道的频谱重叠 很像正交调制 SDR 软件定义无线电 是指一种无线电通信系统 可以配置为通过可编程硬件平台在大频谱范
  • 最新ChatGPT GPT-4 自然语言理解NLU与句词分类技术详解(附ipynb与python源码及视频讲解)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(四)

    目录 前言 最新ChatGPT GPT 4 自然语言理解NLU与句词分类技术详解 1 NLU基础 1 1 句子级别的分类 1 2 Token级别的分类 2 相关API 2 1 LMAS GPT API 2 2 ChatGPT Style 相
  • Linux中的计时函数

    2023年7月22日 周六上午 目录 预备知识 Linux系统函数sysconf 函数原型 参数介绍 使用方法 数据类型clock t times 函数原型 tms结构体 使用方法 clock 函数原型 使用方法 预备知识 Linux系统函
  • CRM之B/S和C/S架构的区别(下)

    B S 模式的缺点 1 响应速度不及C S 随着AJAX技术的发展 相比传统B S结构软件提升一倍速度 2 用户体验效果不是很理想 B S需要单独界面设计 厂商之间的界面也是千差万别 由于浏览器刷新机制 使用时有刷屏现象 好在AJAX技术解
  • 第二章:预备知识整理——2.2数据预处理

    数据预处理的课后习题为 2 2 5 练习 创建包含更多行和列的原始数据集 删除缺失值最多的列 将预处理后的数据集转换为张量格式 1 该问题的解决 感谢https blog csdn net qq 42363032 article detai
  • RabbitMQ 高级特性

    RabbitMQ 高级特性 生产者确认 confirm return confirm确认模式 return 退回模式 消费者确认 ACK 消费端限流 TTL过期时间 死信队列 延迟队列 保证幂等性 生产者代码实现 消费者代码实现 在使用 R
  • ANDROID项目重构之路:架构篇

    原创文章 转载请注明 转载自Keegan小钢 写于2015 06 05 去年10月底换到了新公司 做移动研发组的负责人 刚开始接手android项目时 发现该项目真的是一团糟 首先是其架构 是按功能模块进行划分的 本来按模块划分也挺好的 可
  • <cwchar> (wchar.h)

    英文原文地址 https cplusplus com reference cwchar 我会持续更新 我的翻译如下
  • 1. 开源协议

    开源 Open Source 一词 最早由Christine Peterson女士在1998年提出 它消除了人们对自由软件 Free Software 的理解歧义 软件的分类 商业软件 收费 元代码不公开 共享软件 免费使用 源代码不公开
  • 第三章 系统分析

    第三章 系统分析 本章将对微信小程序及签到应用市场进行需求分析 首先对系统进行功能需求分析 分析确定受众群 分析系统所要实现的功能 然后对系统进行数据需求分析 为了更好地完成系统项目 为项目的进一步开发工作做准备 了解具体数据 有利于软件的
  • Git 开发分支代码上线流程

    开发分支代码上线流程 开发分支 1 切换到master上 pull最新代码 git checkout mater git pull 2 打开发分支 git branch feature 自己taped的任务号 例如 git branch f
  • Linux中 的 " "(双引号) ' ' (单引号) ` `(反引号)

    1 基础篇 单引号 所见即所得 回将里面的内容原封不动的展示出来 双引号 和单引号类似 但里面的特殊符号会被解析 比如 反引号 都是特殊符号 反引号 反引号内的内容将优先执行 优先执行里面的命令 并将结果保留下来 无引号 和双引号类似 但此
  • sql server 查询某个字段是否有值 返回bool类型

    sql server 查询某个字段是否有值 返回bool类型 true 或 false SELECT ColumnCode CONVERT BIT CASE WHEN LEN ColumnCode gt 0 THEN 1 ELSE 0 EN
  • aop默认代理方式是什么

    jdk代理 可以通过proxy target class修改 proxy target class属性值决定是基于接口的还是基于类的代理被创建 如果proxy target class 属性值被设置为true 那么基于类的代理将起作用 这时