深入理解Spring AOP:JDK与CGLIB代理的拦截处理
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
"死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理" 在Spring AOP中,代理对象的创建是为了实现面向切面编程,它允许我们在不修改原有代码的情况下,向方法添加额外的功能,如日志、事务管理等。Spring支持两种代理方式:JDK动态代理和CGLIB代理。这两种代理方式在处理拦截时有所不同。 **JDK动态代理** JDK动态代理依赖于Java的反射机制,适用于目标类实现了接口的情况。在Spring中,`JdkDynamicAopProxy`是负责创建JDK代理对象的类。当一个Bean需要被代理时,Spring会生成一个实现了目标类所有接口的动态代理类。这个代理类会在调用目标方法时,通过实现`java.lang.reflect.InvocationHandler`接口的`invoke()`方法来处理拦截逻辑。 在`JdkDynamicAopProxy`的`getProxy()`方法中,Spring首先获取目标类实现的所有接口,并加上Spring的一些内部接口,然后通过`Proxy.newProxyInstance()`创建代理对象。代理对象在执行方法时,实际上会调用`InvocationHandler`的`invoke()`方法,这个方法会根据配置的Advisor找到对应的Advice(通知),并在调用目标方法前后执行相应的逻辑。 **CGLIB代理** 对于未实现接口的目标类,Spring会使用CGLIB库来创建代理对象。CGLIB是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。Spring中的`ObjenesisCglibAopProxy`负责创建CGLIB代理对象。CGLIB通过字节码技术生成一个目标类的子类,这个子类在运行时被动态加载,它重写了目标类的方法,从而能够在调用方法时插入切面逻辑。 在CGLIB代理中,拦截处理发生在`MethodInterceptor`的`intercept()`方法。Spring将所有的Advisor转换为`Callback`对象,这些`Callback`在代理对象调用方法时会被执行。每个`Callback`代表一个特定的拦截行为,例如`MethodInterceptor`。 **代理选择** Spring会根据目标类是否实现接口来决定使用哪种代理方式。如果目标类实现了接口,那么会选择JDK动态代理;如果没有实现接口,或者为了性能考虑,可以选择CGLIB。但需要注意的是,从Spring 5开始,如果JDK版本支持,即使目标类没有接口,Spring也会优先尝试使用JDK动态代理。 **总结** Spring AOP的两种代理方式各有优劣。JDK动态代理不需修改目标类,但要求目标类实现至少一个接口。CGLIB代理无需接口,但性能上可能略逊于JDK代理。理解这两种代理的工作原理对于深入学习Spring AOP至关重要,可以帮助我们更好地设计和优化面向切面的代码。同时,熟悉源码分析可以加深对Spring框架的理解,提升问题排查和优化的能力。
![](https://csdnimg.cn/release/download_crawler_static/56367711/bg5.jpg)
![](https://csdnimg.cn/release/download_crawler_static/56367711/bg6.jpg)
剩余25页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/28b1b1aff78e45628291a3dbdb3c233c_weixin_44488560.jpg!1)
- 粉丝: 0
- 资源: 2万+
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Vue实现iOS原生Picker组件:详细解析与实现思路
- Arduino蓝牙小车:参数调试与功能控制
- 百度Java面试精华:200页精选资源涵盖核心知识点
- Swift使用CoreData填坑指南:CoreData在Swift 3.0的变化
- 微距离无线充电器创新设计及其实验探索
- MTK Android平台开发全攻略:44步详解流程
- RecyclerView全面解析:替代ListView的新选择
- Android开发:自动适配中英文键盘解决方案
- Android调用WebService接口教程
- Android开发:BitmapUtil图片处理全解析与实例
- Android多线程断点续传实现详解
- PCA算法在人脸识别会议签到系统中的应用
- EventBus 3.0:Android事件总线详解与实战应用
- Android FileUtil:全面解析文件操作实用技巧与实例
- RecyclerView添加头部和尾部实战教程
- Android实现微博滑动固定顶部栏实战与优化
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)