Spring AOP 代理机制

Spring AOP与代理机制 Spring AOP简介 面向切面编程,它可以将在项目中重复的代码横向抽离出来。举个例子,现在有几个业务方法,每个方法都需要在开始和结束的时候写一次日志,如果不使用aop的话,这日志的代码是需要在这几个方法里重复写好几次的,而aop通过代理机制,只保留一份写日志的代码,然后把代码切到每个方法里。 Spring AOP概念 切入点 切入点用来指定需要对哪个方法进行增强 连接点 连接点用来指定执行增强代码的时机,比如在切入点指定的方法调用前执行或者是调用后执行 通知 连接点执行的增强的代码 切面 由切入点和通知 阅读详情

Spring Framework reference 2.0.5 参考手册中文版 6.6. 代理机制 中是这样写的

 

Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。(建议尽量使用JDK的动态代理)

如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。

如果你希望强制使用CGLIB代理,(例如:希望代理目标对象的所有方法,而不只是实现自接口的方法)那也可以。但是需要考虑以下问题:

  • 无法通知(advise)Final 方法,因为他们不能被覆写。
  • 你需要将CGLIB 2二进制发行包放在classpath下面,与之相较JDK本身就提供了动态代理

强制使用CGLIB代理需要将 <aop:config> 的 proxy-target-class 属性设为true:

<aop:config proxy-target-class="true">
...
</aop:config>

当需要使用CGLIB代理和@AspectJ自动代理支持,请按照如下的方式设置 <aop:aspectj-autoproxy> 的 proxy-target-class 属性:

<aop:aspectj-autoproxy proxy-target-class="true"/>
而实际使用的过程中才会发现细节问题的差别,The devil is in the detail.
JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。
Spring是依靠什么来判断采用哪种代理策略来生成AOP代理呢?以下代码就是Spring的判断逻辑
//org.springframework.aop.framework.DefaultAopProxyFactory   
    
//参数AdvisedSupport 是Spring AOP配置相关类   
    public AopProxy createAopProxy(AdvisedSupport advisedSupport)   
            
throws AopConfigException {   
        
//在此判断使用JDK动态代理还是CGLIB代理   
        if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass()   
                
|| hasNoUserSuppliedProxyInterfaces(advisedSupport)) {   
            
if (!cglibAvailable) {   
                
throw new AopConfigException(   
                        
"Cannot proxy target class because CGLIB2 is not available. "  
                                
+ "Add CGLIB to the class path or specify proxy interfaces.");   
            }   
            
return CglibProxyFactory.createCglibProxy(advisedSupport);   
        } 
else {   
            
return new JdkDynamicAopProxy(advisedSupport);   
        }   
    }  

advisedSupport.isOptimize()与advisedSupport.isProxyTargetClass()默认返回都是false,所以在默认情况下目标对象有没有实现接口决定着Spring采取的策略,当然可以设置advisedSupport.isOptimize()或者advisedSupport.isProxyTargetClass()返回为true,这样无论目标对象有没有实现接口Spring都会选择使用CGLIB代理。所以在默认情况下,如果一个目标对象如果实现了接口Spring则会选择JDK动态代理策略动态的创建一个接口实现类(动态代理类)来代理目标对象,可以通俗的理解这个动态代理类是目标对象的另外一个版本,所以这两者之间在强制转换的时候会抛出java.lang.ClassCastException。而所以在默认情况下,如果目标对象没有实现任何接口,Spring会选择CGLIB代理, 其生成的动态代理对象是目标类的子类。

上说的是默认情况下,也可以手动配置一些选项使Spring采用CGLIB代理。

org.springframework.transaction.interceptor.TransactionProxyFactoryBean是org.springframework.aop.framework. ProxyConfig的子类,所以可以参照ProxyConfig里的一些设置如下所示,将optimize和proxyTargetClass任意一个设置为true都可以强制Spring采用CGLIB代理。

如果当需要使用CGLIB代理和@AspectJ自动代理支持,请按照如下的方式设置 <aop:aspectj-autoproxy> 的 proxy-target-class 属性:
<aop:aspectj-autoproxy proxy-target-class="true"/>

这样使用CGLIB代理也就不会出现前面提到的ClassCastException问题了,也可以在性能上有所提高,关

Keil5与ARM编译器V5安装指南:从下载到配置全流程解析 本文提供Keil5与ARM Compiler V5的完整安装与配置指南。针对新版Keil5默认不包含V5编译器导致老工程编译失败的问题,详细解析了从软件下载、授权管理到获取并正确安装ARM Compiler V5(AC5)的全流程,确保开发者能顺利搭建兼容老项目的稳定开发环境。 阅读详情

相关推荐

死区补偿---学习笔记

最近调试中发现,死区补偿对电流谐波和电流带宽影响挺大,于是对死区补偿产生浓厚兴趣,找来几篇文章粗读并做一下笔记。 传统做法 无非就是根据电流方向补偿,假如svpwm计算出的A相理论导通实践为T1,死区时间是Td,则实际导通时间T = T1-Td(when ia >0 ),于是在svpwm计算出的导通时间T1的基础上加上Td。这样经过PWM模块后,实际的导通时间即为T1. 但存在两个难点(个人总结): 1,受电流检测精度影响,尤其是在过零点检测困难。 2,真实的二极管导通需要一定电压,并非..

圆桌骑士的博客 2万+

Spring-AOP

AOP 入口 通过扫描注解@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)注册了AOP 入口类,具体看看注解里面的 @Import(AspectJAutoProxyRegistrar.class) proxyTargetClass true 1、目标对象实现了接口– 使用CGLIB 代理机制 2、目标对象没有接...

Andy_Health的博客 1229

Windows10 使用Apple Studio Display显示器的设置

AppleStudioDisplay显示器购买花了近1.5wRMB,由于为windows台式机,显卡为NVIDAGTX-1660,而AppleStudioDisplay只有雷电接口,尝试了很多种转接方式,均以失败告终,最终使用贝尔金VR线成功,,附图如下这边也测试过NVIDARTX-2060Super、NVIDAGTX-1650显卡,都是能点亮的,NVIDA1650存在关机重启后黑屏,不稳定现象,2060也存在关机重启后不亮现象,后面发现1660s很稳定。...

爱意随风起,人生不可弃。 1万+

JDK代理和CGLIB代理 (springboot proxyTargetClass=true)

eclipse 报错The bean 'xxx' could not be injected as a 'xxx because it is a JDK dynamic proxy that implements:xxx 最后定位是代理问题,今天我们来讨论下spring两种代理的问题 JDK代理和CGLIB代理 (springboot proxyTargetClass=true)

Mr.hu 9642

深入解析LVDS电平标准在LCD屏接口设计中的关键作用

本文深入解析了LVDS电平标准在LCD屏接口设计中的核心作用。文章不仅阐释了LVDS低电压差分信号的工作原理、关键电气参数及抗噪优势,还详细对比了VESA与JEIDA两种主流数据格式,并提供了从PCB布局布线到信号调试的实战避坑指南,是确保高速、稳定显示的关键技术参考。

weixin_28419039的博客 334

完美解决LBP2900打印机安装驱动提示无法识别USB及连接错误等问题(附Win11全新安装支持及卸载方案)

LBP2900打印机虽然经典老旧,但在Win11上依然可以完美使用!许多网上教程都无视安装失败后的问题,在此分享一种全新、100%有效的方法来解决驱动连接错误和无法识别USB设备的问题。无论是新安装还是卸载重装,这个方法都适用。本文整合了通用驱动包,支持Win2000到Win11系统,操作简单,轻松摆脱安装困扰,享受无忧打印体验!

心开始の未来~的博客 2万+

proxy-target-class="true" 与proxy-target-class="false"的区别

首先我有一个abstractService父类,子类UserService继承这个父类,没有写UserService接口(IUserService)。然后再UserAction中用: User u = ((UserService) SpringUtils.getBean("userService")).queryByUsername(model); User u = ((UserService

rose_zz的专栏 2524

用Simulink对Carsim车辆进行档位控制

用Simulink对Carsim车辆进行档位控制一、carsim中的档位设置为开环控制二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear三、双击进去设置常量为 0四、输入和输出IO通道五、验证 :输入 为 3 档 ----- 输出 为 3!六、参考 一、carsim中的档位设置为开环控制 二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear 三、双击进去设置常量为 0 四、输入和输出IO通道 五、验证 :输入 为 3 档 -

qq_42027654的博客 2601

spring学习——proxy-target-class详解

<aop:aspectj-autoproxy proxy-target-class="true" /> aop:aspectj-autoproxy的意识是:启动@AspectJ注解驱动的切面 那么***proxy-target-class=“true”***是什么意思呢? proxy-target-class属性决定代理的创建方式: true:启用cglib代理(基于类); fals...

lovesman的博客 838

基于ROS2的无人机野生动物巡查系统设计

自主巡检系统是嵌入式人工智能与机器人技术融合的关键应用方向,其核心在于多源感知融合、实时路径规划与端侧智能识别的协同实现。原理上依赖SLAM定位构建环境地图,结合栅格化建模与混合路径算法(如蚁群+BFS)达成全覆盖遍历;技术价值体现在资源受限平台下的确定性响应与时空对齐能力,支撑高鲁棒性野外作业。典型应用场景包括生态监测、禁飞区巡检及小尺度智能安防。本文围绕ROS2 Humble中间件架构、Livox激光雷达与MaixCAM视觉协同、YOLO11n INT8模型端侧部署等关键技术展开,突出嵌入式AI与实时控

weixin_30598047的博客 649

华为OD机考双机位C卷 - AI处理器组合 (Java & Python & JS & GO & C++ & C)

> 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录点击查看: [【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)](https://blog.youkuaiyun.com/banxia_frontend/article/details/155503868)

算法大师! 233

强制使用CGLIB实现动态代理@EnableAspectJAutoProxy(proxyTargetClass = true)

AOP

小泽 1557

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

6045

Spring Boot AOP(二) 代理机制解析

本文深入解析了Spring Boot AOP的代理机制,主要包括两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理基于接口生成代理对象,通过InvocationHandler转发方法调用;而CGLIB通过生成目标类的子类,使用MethodInterceptor拦截方法调用。Spring会根据Bean是否实现接口自动选择代理类型,也可通过配置强制使用CGLIB。文章详细分析了两种代理的核心类、调用流程及特点,并梳理了Spring代理生成的核心源码逻辑,包括代理选择机制和调用链执行过程,帮助开发者深入

Java、Python、AI、前沿技术等领域的技术总结和经验分享。 2231

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring AOP代理机制深度解析

本文介绍了Spring AOP的多种代理配置方式。主要内容包括:1)使用模板化Bean定义简化事务代理配置,通过抽象父Bean复用配置;2)编程方式创建代理(ProxyFactory)以及运行时操作已生成代理(Advised接口);3)自动代理机制(BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator)实现自动扫描和代理;4)高级目标对象管理(TargetSource)支持热替换、池化等特性;5)通过SPI扩展点自定义通知类型。文中还对比了传统XML

m0_37607945的博客 747

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

浅谈Spring的AOP实现-代理机制

说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以不用继续往下读: 1. Spring的AOP的实现方式有哪些? 2. 为什么使用代理机制? 3. 它们是怎么实现的? 4. 它们的区别是什么? 下面进入正题,Spring采用代理的方式实现A...

zhuguang10的博客 434

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

spring AOP的代理机制

使用AOP实现日志的例子: https://www.cnblogs.com/qlqwjy/p/8747476.html AOP 思想: 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强 ! AOP应用场景 场景一: 记录日志 场景二: 监控方法运行时间 (监控性能) 场景三: 权限控制 场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 ) 场景五: 事务管

emilywisy的博客 230

从代理机制到Spring AOP,这篇给你安排的明明白白的

这篇文章准备从Java的代理机制讲到Spring的AOP。 1.代理模式 代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通过代理来实际联系委托方的客户三个角色。 举个生活中很常见的例子,各路的明星都会有个自己的经纪人来替自己打点各种各样的事情,这种场景下,明星本身是委托方,经纪人是代理方,明星把自己安排演出、出席见面会的时间安排权利委托给经纪人,这样当各个商家作为客户想要请明星来代言时,就只能通过经纪人来进行。 这样明星本

勇往直前的专栏 3432

深入理解 Spring AOP 代理机制:JDK 动态代理与 CGLIB 的对比与选择

JDK 动态代理基于接口,CGLIB 基于继承Spring 默认优先使用 JDK 动态代理,无法使用时切换到 CGLIB可以通过配置强制使用 CGLIB 代理CGLIB 首次生成代理类较慢,但运行时性能更优。

Landcc的博客 1676

spring aop 自动代理机制

我们一直使用ProxyFactoryBean来显式的创建AOP代理。但是在很多场合,这种方式将会使编写配置文件的工作量大大增加;由于要从ProxyFactoryBean获得代理对象,也会使应用和Spring之间的耦合度增加。下面介绍使用Spring提供的自动代理机制来解决这类问题。 1、使用BeanNameAutoProxyCreator Spring提供的BeanNa...

任天仇 256

【深入理解Spring AOP】核心原理与代理机制详解

面向切面编程(Aspect-Oriented Programming)是一种通过预编译方式和运行期动态代理实现程序功能统一维护的技术。它是对OOP的补充,专门用于处理分布在应用中多处的功能(称为横切关注点)。核心价值分离业务逻辑与系统服务(如日志、事务)提高代码复用性使开发者更专注于业务实现Spring AOP通过巧妙的代理机制实现了强大的切面编程能力。理解其底层原理对于正确使用和问题排查至关重要。根据具体场景选择合适的代理方式遵循"单一职责"原则设计切面注意性能敏感场景的优化。

weixin_42505102的博客 69

深入理解Spring AOP:核心原理与代理机制详解

面向切面编程(Aspect-Oriented Programming)是一种通过预编译方式和运行期动态代理实现程序功能统一维护的技术。它是对OOP的补充,专门用于处理分布在应用中多处的功能(称为横切关注点)。核心价值分离业务逻辑与系统服务(如日志、事务)提高代码复用性使开发者更专注于业务实现Spring AOP通过巧妙的代理机制实现了强大的切面编程能力。理解其底层原理对于正确使用和问题排查至关重要。在实际项目中,建议:根据具体场景选择合适的代理方式遵循"单一职责"原则设计切面。

kfashfasf的博客 887

Spring AOP 代理机制网课推荐

Spring AOP 代理机制网课推荐

三冬暖 184
上一篇: 常用js函数(2)
下一篇: Spring 事务简化配置
hjpengjava
博客等级 码龄18年 5粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值