AOP静态代理与动态代理

本文介绍了AOP(面向切面编程)的概念,用于处理系统中的横切关注点,如事务管理、日志和缓存。文章详细阐述了静态代理和动态代理的区别。静态代理在编译时增强字节码,而动态代理则在运行时生成AOP对象。在Spring AOP中,动态代理分为JDK动态代理(要求目标类实现接口)和CGLIB动态代理(针对未实现接口的目标类)。CGLIB代理需要注意final类和特定方法类型的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AOP

面相切面编程,是作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理,日志,缓存,异常等。


AOP代理分类

静态代理和动态代理


静态代理

静态代理就是AOP框架会在编译阶段将Aspect植入java字节码中,生成AOP代理类,在运行的时候,是直接运行其增强的AOP对象,因此也称为编译时增强(反编译*.class可以发现和源代码不一样);AspectJ就是典型的静态代理增强;


动态代理

动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调对方的方法;Spring AOP使用的是动态代理


Spring AOP中动态代理的分类

JDK动态代理和CGLiB动态代理


JDK动态代理

通过反射来接受被代理的类,并且要求被代理的类必须实现一个接口;

JDK动态代理的核心是InvocationHandler接口和Proxy类


CGLIB动态代理

如果目标类,没有实现接口,那么spring AOP会选择使用CGLIB来动态代理目标类;

CGLIB(Code Generation Library)是一个代码生成的类库,可以再运行时动态的生成某个类的子类;

注意CGLiB是通过集成的方式做的动态代理,因此如果某个类是final,是无法使用CGLIB动态代理的;

同理,由于是继承方式,如果是 static方法,private方法,final方法等描述的方法是不能被代理的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值