Spring AOP两种动态代理

Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB) 代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理。如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理;如果目标对象没有实现任何接口,则会创建CGLIB动态代理。CGLIB是第三方包,从Spring4.3开始就无需再次导入包了。 注意 客户端直接调用与目标类相对应的代理类的功能,为了保证代理类与目标类具有相同功能,代理类与目标类必须实现相同的接口 代理是实现AOP的核心和关键技术。只要是AOP,就一定会涉及代理技术 . 代理技术的分类 按照是否 阅读详情

1.AOP定义

AOP(Aspect Oriented Programming),即面向切面编程,有助于我们将不同但是有必要的重复性代码重构为不同的模块,也就是把那些与业务无关,但是又被业务模块所共同调用的逻辑或行为封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性

使用场景:日志、权限、事务、异常等。

 

2. AOP术语

通知(Advice):抽取的共性代码。切面的工作,通知定义了切面是什么以及如何使用(就是你想要的功能,所说的事务、日志等)

  1. Before——在方法调用之前调用通知
  2. After——在方法完成之后调用通知,无论方法执行成功与否
  3. After-returning——在方法执行成功之后调用通知
  4. After-throwing——在方法抛出异常后进行通知
  5. Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

连接点(JoinPoint):类中的方法。是一个应用程序中能够插入切面的点(调用方法,掏出异常时,修改字段时),就是和方法有关的前前后后都是连接点,

切入点(Pointcut):是指被抽取了共性功能的方法。匹配通知所要织入的一个或者多个连接点

注意:切入点一定是连接点,但是连接点不一定是切入点

目标对象(Target Object):只包含切入点的类对象,缺少完整逻辑的对象

代理对象(AOP Proxy):spring AOP生成一个代理对象,在切入点的地方,把通知织入

 

 

3. Spring AOP代码实现

    (1).切面

@Component
@Aspect
public class TestAspect{

    @PointCut("excution(* com.dao.*.*(..))*)
    public void pointCut(){

       
    }

    
    @Before("pointCut()")
    public void before(){
       
        System.out.println("advice before");
       
    }


}

  (2). Dao层

public Interface IndexDao{

    public void query();

}

 

  (3). DaoImpl层

@Component
public class IndexDaoImpl implements IndexDao{

  
    public void query(){

        System.out.println("dao-query");
    }


  

  (4). 测试Test

public class Test{


    public static void main(String[] args){


         AnnotationConfigApplicationContext applicationContext  = new AnnotationConfigApplicationContext();
 
        IndexDao dao=applicationContext.getBean("IndexDao.class);

        dao.query();

    }

}

     (5). 输出结果

       

 

4. Spring AOP实现原理

(1)JDK动态代理:通过反射代理来接收被代理的类,并且要求被代理的类必须实现一个接口,核心是InvocationHandler接口和Proxy类

(2)CGLIB,是一个代码生成的库,可以在运行时动态的生成某个类的子类,注意:CGLIB是通过继承的方式做的动态动力,因此如果某个类被标记为final,那么他是无法使用CGLIB做动态代理

注意事项:

          (1)目标对象实现了接口,并且ProxyTargetClass=false(默认是false),采用JDK的动态代理实现AOP

          (2)设置ProxyTargetClass=true ,永远使用的是CGLIB实现AOP(即使目标实现了接口)

            (3)   目标对象没有实现接口,必须采用CGLIB的动态代理,Spirng会自动在JDK和CGlib用切换

总结:不管哪一种方式都不能用private和final做修饰词,JDK的动态代理比CGLIB代理执行速度快,但性能不如CGLIB好

 

 

【Spring Boot实战与进阶】AOP的两种动态代理(JDK和Cglib) 引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。 阅读详情

相关推荐

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 330

SpringAop动态代理的两种实现方式

Spring的面向切面编程也是基于动态代理来实现的 静态代理:也就是自己手动创建的代理对象 动态代理:也就是在程序运行中通过配置参生的 那么Spring的AOP也就是面向切面编程,就是基于动态代理来实现的,通过代理原始类增加额外功能,我们可以将额外功能一次定义然后配合切点达到多次使用的效果,比如 做日志啊 事物啊 时间啊等等…提高了复用性 开发效率. 那么在Spirng当中动态代理有两种 第一种也就是JDK自带的动态代理 1.JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用In

qq_28754027的博客 6080

SPD5 集线器协议内容解析

​ 若不同SPD5 Hub后面的本地侧设备同时发送请求,则是22和23、24的混合过程,先通过LID裁决,再通过HID裁决,这里的LID是本地设备的,若LID一致,则看HID,由于SPD5 Hub的本地侧设备HID均为111,因此实际上是比较SPD5 Hub的HID,这个过程在前文提到,SPD5 Hub会转换HID。​ 若MR27[4]=1且MR27[3:0]=1,如果MR51[3:0]=1时,发送IBI,并且MR48[7]置1,将GETSTATUS CCC的待处理中断位[3:0]更新为0001。

weixin_50591344的博客 3860

动态代理(初级)

动态代理(理解): 基于反射机制。 一. 代理以及动态代理含义 1. 代理 & 静态代理 2. 动态代理

Ye_mulin的博客 469

一文带你完成ARMv8架构中的cache知识点

【摘要】 在最初开发ARM架构时,处理器的时钟速度和内存的访问速度大致相同。今天的处理器内核要复杂得多,其时钟速度可以快上几个数量级。但是,外部总线和内存设备的频率并没有扩大到同样的程度。有可能实现小块的片上SRAM,它可以以与内核相同的速度运行,但是与标准的DRAM块相比,这种RAM非常昂贵,因为后者的容量可以达到数千倍。在许多基于ARM处理器的系统中,访问外部存储器需要几十甚至几百个内核周期。 cache的技术背景 在最初开发ARM架构时,处理器的时钟速度和内存的访问速度大致相同。今天的处.

ABCCloud的博客 1853

运算放大器基础1——用作比较器

运算放大器,运放,在电路设计中非常常见。在图2中,当前状态下,开关切换到0V,“正相输入”和“负相输入”都是接地,运放两个输入端电压相同。最后,调节可变电阻,使其两端电压大于3.37V,比如3.43V,作为运放正相输入,由于电压大于反相输入,LED点亮(运放输出为5V)。其次,调节可变电阻,使其两端电压小于3.37V,比如2.09V,作为运放正相输入,由于电压小于反相输入,LED不点亮。好,现在我们将0.1V电源换个方向,这样实际“正相输入”的是-0.1V,比“负相输入”的电压要低,看看输出是什么?

m0_60069998的博客 6123

【学习笔记】Spring中的动态代理

本文参考了文章Spring AOP动态代理的实现方式和文章Spring中的动态代理。 1. 动态代理的两种实现方式 (1) 两种动态代理 Spring中的AOP(面向切面编程)是基于动态代理技术实现的,而动态代理是基于反射设计的。动态代理的实现方式有2种:JDK动态代理和CGLIB动态代理。 JDK动态代理:通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,核心是InvocationHandler接口和Proxy类 CGLIB(Code Generation Library)动态代理:CGLI

zuzhiang的博客 2006

SAR学习笔记后续-phased工具箱介绍

摘要:相控阵雷达介绍,基于仿真对MATLAB中phased工具箱进行了详细介绍

yjh_2019的博客 1万+

spring 动态代理_Spring中的两种动态代理

两种动态代理1、java动态代理利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。2、cglib动态代理利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 spring中的动态代理 spring会自动在JDK动态代理和CGLIB之间转换1、 默认使用Java动态代理 来创建AOP代理,这样就可以为任何接口实例创建代理了。2、当需要代理的类没有实现代理接口的时候,Spring会切换为使用CGLIB代理。3、可以通过配置 强制使

mywaya2333的博客 3965

逆向淘宝x-mini-wua:从加密算法到设备指纹的生成逻辑

本文深入剖析了淘宝风控核心参数x-mini-wua的生成逻辑与加密算法。通过逆向分析,揭示了其作为设备“身份证”的作用,详细拆解了从硬件信息采集、SG_INNER_DATA文件解密、关键参数提取到最终长wua合成的完整技术链条,并探讨了模拟生成与绕过风控的实战思路及注意事项。

year5的博客 1076

Windows事件ID 10010报错:DCOM注册超时与Game Bar修复指南

DCOM(分布式组件对象模型)是Windows中用于跨进程组件通信的核心机制,其注册超时问题常表现为事件ID 10010报错。当Game Bar的PresenceWriter组件因权限配置不当、组件损坏或开机资源竞争而无法在限定时间内向DCOM注册时,系统会记录该错误,并可能伴随DCOM服务主机CPU占用升高或游戏栏功能异常。理解DCOM激活原理与Network Service账户权限,有助于从权限修复、组件重注册及开机时序优化等层面系统排查。本文针对不同Windows版本,提供从静默处理到根治的完整方案,

weixin_33563728的博客 905

Spring AOP 支持哪两种动态代理方式?

特性JDK 动态代理CGLIB 代理代理方式基于接口(实现共同接口)基于继承(创建子类)前提条件目标对象必须实现接口目标对象不能是 final 类性能在早期版本中,通过反射调用性能略低于 CGLIB。但在目前JDK 版本中,两者性能差距已经非常小。性能通常被认为略高,因为它直接操作字节码并调用super。Spring Boot 默认否是。

专注于技术分享 534

基于STM32设计的指针式电子钟与万年历(升级版)

这是基于STM32设计的一个指针式电子钟+万年历小项目,采用3.5寸的LCD屏显示时钟,日历、温度、天气,支持触摸屏调整设置时间,设置闹钟,查看日历等等。整体项目主要是技术点就是LCD屏的图形绘制。比如: 时钟的时针绘制、分针、秒针、表盘、日历绘制等等。

1万+

spring中AOP动态代理的两种方式

AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理——JDK Proxy ⚫ JDKProxy动态代理是针对对象做代理,要求原始对象具有接口实现,并对接口方法进行增强 在aop动态代理的时候发现这个类是实现接口的类,就选择JDK的动态代理,从ioc中获取这个动态代理的实现类就需要按照接口.class去获取 CGLIB动态代理方式,继承方式 动态代理——CGLIB ⚫ CGLIB(Code

fushuai优快云的博客 1326

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring AOP动态代理的两种实现方式

Spring AOP动态代理的两种实现方式 Aspect Oriented Programming 面向切面编程 通过预处理和运行期动态代理的方式, 实现功能的统一维护 作用: 在运行期间, 不修改源码的情况下, 增加方法的功能 优势: 减少重复代码, 也便于维护 底层实现: 动态代理技术 两种动态代理方式 jdk代理 : 基于接口的动态代理技术 cglib代理: 基于父类的动态代理技术 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTD2b8jY-1610634

言之。 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring AOP 和 两种动态代理详解————超详细

两种动态代理详解

qq_40091033的博客 891

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring AOP 的两种动态代理机制:JDK和CGLib

zSpring AOP简介AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代...

wenlin_xie的专栏 1005

Spring AOP 支持的两种模式动态代理(JDK Proxy 和 cglib)

在 Spring 中,AOP(面向切面编程)可以通过动态代理实现。和。这两种方式各有特点,适用于不同的场景。

weixin_37804164的博客 1078

Spring AOP 两种动态代理机制

Spring AOP 使用动态代理技术在运行期织入增强的代码。其使用的动态代理机制有如下两种: 基于 JDK 的动态代理; 基于 CGLib 的动态代理; 之所以需要两种代理机制,很大程度上是因为JDK 本身只提供接口的代理,而不支持类的代理;而 CGLib 很好的弥补了这点,它通过创建子类,在子类中拦截父类的方法并织入横切逻辑,实现对类的代理,但是其不能对目标类中的 final 或 p...

Daz_M的博客 4402

Spring AOP的底层实现有两种方式 JDK动态代理和CGLib动态代理

首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式。 自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方。 JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler。其中,InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横切逻辑和业务逻辑贬值

qq_40331861的博客 930

spring实现AOP的两种方式以及实现动态代理方式

AOP: 方式一:Annatation 注解方式 1、spring依赖库  * SPRING_HOME/dist/spring.jar  * SPRING_HOME/lib/jakarta-commons/commons-logging.jar  * SPRING_HOME/lib/log4j/log4j-1.2.14.jar  * SPRING_HOME/lib/aspect

szl的专栏 4352

spring-aop 两种代理方式 JDK动态代理和CGLIB动态代理

spring-aop 两种代理方式 JDK动态代理和CGLIB动态代理 Spring的两大特性是IOC和AOP: Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反转”;AOP(Aspect-OrientedProgramming),即“面向切面编程”。下面分享我个人对AOP特性的理解。 AOP的实际应用: 面向切面编程,通常被定义为系统关注点...

zzm1602257468的博客 631

Spring之静态代理、动态代理(实现动态代理的两种方式)与AOP底层实现动态代理(两种方式)

Spring之静态代理、动态代理(实现动态代理的两种方式)与AOP底层实现动态代理(两种方式) 2-1代理 2.1.1 静态代理 抽象角色:一般是接口或者抽象类 真实角色:也就是目标对象 被代理的角色 代理角色:代理目标对象 除了实现目标对象中的功能外 还可以额外扩展其它功能 客户角色:使用代理角色完成其需要执行的功能 静态代理的好处: 可以使我们的目标对象(真实角色)功能更加纯粹 不需要关注于其它事务 公共的业务由代理来完成 实现了业务的分工 公共业务需要扩展时更加方便 减少了代码的冗余性 2.1

qq_42662411的博客 363

Spring中AOP实现的两种方式之JDK和cglib的动态代理

AOP的实现原理: 都是基于代理模式,都是生成一个大代理对象 静态AOP: AspectJ实现的AOP, 将切面代码直接编译到Java类文件中 --- 实现: JDK提供的动态代理技术 动态AOP: 将切面代码进行动态织入实现的AOP --- Spring的AOP为动态AOP --- 实现: CGLIB(动态字节码增强技术) cglib创建的动态代理对象性能比JDK创建性能高很多,但是cgl

kelan的博客 1213

【Spring】Spring中AOP解析 上 两种动态代理方式与ProxyFactory代理工厂

1.两种动态代理方式演示 1.1 JDK动态代理 JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。要求被代理类必须实现一个接口 . 如下案例 接口 public interface TargetInterface { public void say(); } 被代理类 public class Target implements TargetInterface{ @Override public void say()

纸上得来终觉浅,绝知此事要躬行 2876
上一篇: mybatis知识点
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值