【Spring AOP】AOP 底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂如何加工原始对象
AOP编程
- AOP 编程
- AOP 概念
- AOP 编程的开发步骤
- 切面的名词解释
- AOP 的底层实现原理
- 动态代理类的创建
- JDK 的动态代理(原理 + 编码)
- CGlib 的动态代理
- Spring 工厂如何加工原始对象
更多内容请查看笔记目录:【Spring 5.x】学习笔记汇总
AOP 编程
AOP 概念
POP (Producer Oriented Programing)
- 面向过程(方法、函数)编程 —— C
- 以过程为基本单位的程序开发,通过过程间的彼此协同,相互调用,完成程序的构建。
OOP (Object Oritened Programing)
- 面向对象编程 —— Java
- 以对象为基本单位的程序开发,通过对象间的彼此协同,相互调用,完成程序的构建。
AOP (Aspect Oriented Programing)
- 面向切面编程 = Spring动态代理开发
- 以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建。
- 切面 = 切入点 + 额外功能
AOP 的概念:
- 本质就是 Spring 的动态代理开发,通过代理类为原始类增加额外功能。
- 好处:利于原始类的维护
- 注意:AOP 编程不可能取代 OOP,AOP 是 OOP 编程的补充。
AOP 编程的开发步骤
- 原始对象
- 额外功能 (
MethodInterceptor
) - 切入点
- 组装切面 (额外功能+切入点)
详情可参见之前的博客:Spring 动态代理开发详解
切面的名词解释
切面 = 切入点 + 额外功能
几何学:面 = 点 + 相同的性质
AOP 的底层实现原理
核心问题:
- AOP 如何创建动态代理类?
动态字节码技术 - Spring 工厂如何加工创建代理对象?
通过原始对象的 id 值,获得的是代理对象
动态代理类的创建
JDK 的动态代理(原理 + 编码)
Proxy.newPorxyInstance
方法参数详解
- 编码
public class TestJDKProxy {/**1. 借⽤类加载器 TestJDKProxy 或 UserServiceImpl 都可以2. JDK8.x 前必须加 finalfinal UserService userService = new UserServiceImpl();*/public static void main(String[] args) {// 1. 创建原始对象UserService userService = new UserServiceImpl();// 2. JDK 动态代理InvocationHandler handler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("---- proxy log ----");// 原始方法运行Object ret = method.invoke(userService, args);return ret;}};UserService userServiceProxy = (UserService) Proxy.newProxyInstance(TestJDKProxy.class.getClassLoader(),userService.getClass().getInterfaces(),handler);userServiceProxy.login("zhenyu", "123456");userServiceProxy.register(new User());}
}
CGlib 的动态代理
CGlib 创建动态代理的原理:通过父子继承关系创建代理对象,原始类作为父类,代理类作为子类,这样既可以保证 2 者方法⼀致,同时在代理类中可以提供新的实现(额外功能+原始方法)。
- CGlib 编码
public class TestCglib {public static void main(String[] args) {// 1. 创建原始对象UserService userService = new UserService();/*2. 通过 cglib 方式创建动态代理对象对比 jdk 动态代理 ---> Proxy.newProxyInstance(classLoader, interface, invocationHandler);Enhancer.setClassLoader()Enhancer.setSuperClass()Enhancer.setCallBack() ---> MethodInterceptor(cglib)Enhancer.createProxy() ---> 创建代理对象*/Enhancer enhancer = new Enhancer();enhancer.setClassLoader(TestCglib.class.getClassLoader());enhancer.setSuperclass(userService.getClass());MethodInterceptor interceptor = new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("--- cglib log ----");Object ret = method.invoke(userService, args); // 执行原始方法return ret;}};enhancer.setCallback(interceptor);UserService userServiceProxy = (UserService) enhancer.create();userServiceProxy.login("zhenyu", "123456");userServiceProxy.register(new User());}
}
总结
- JDK 动态代理
Proxy.newProxyInstance
:通过接口创建代理的实现类 - Cglib 动态代理
Enhancer
:通过继承父类创建的代理类
Spring 工厂如何加工原始对象
- 思路分析:主要通过
BeanPostProcessor
将原始对象加工为代理对象
- 编码
public class ProxyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {InvocationHandler handler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("--- new log ---");Object ret = method.invoke(bean, args);return ret;}};return Proxy.newProxyInstance(ProxyBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), handler);}
}
<bean id="userService" class="com.yusael.factory.UserServiceImpl"/>
<!--1. 实现 BeanPostProcessor 进行加工-->
<!--2. 配置文件中对 BeanPostProcessor 进行配置-->
<bean id="proxyBeanPostProcessor" class="com.yusael.factory.ProxyBeanPostProcessor"/>
【Spring AOP】AOP 底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂如何加工原始对象相关推荐
- 【Spring】AOP底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂加工原始对象
一.AOP概念 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建 ...
- mybatis接口中的方法重载_MyBatis底层实现原理: 动态代理的运用
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:祖大俊 my.oschina.net/zudajun/blog/666223 一日小 ...
- Spring 从入门到精通 (十六) AOP底层如何创建动态代理类
关键词:Spring | AOP | 创建代理类 | 底层 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一.创建对象三要素 ...
- Spring 容器AOP的实现原理——动态代理
本文来自极客学院 Spring 容器AOP的实现原理--动态代理 之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大 ...
- 菜鸟学SSH——Spring容器AOP的实现原理——动态代理
之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...
- Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】
Spring AOP[AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别]
- 底层实现_Java AOP的底层实现原理
AOP用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等. AOP实现的关键,在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ ...
- AOP处理事务静、动态代理(jdk方法)
AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...
- Spring框架(一) 底层核心原理解析
感兴趣的话大家可以关注一下公众号 : 猿人刘先生 , 欢迎大家一起学习 , 一起进步 , 一起来交流吧! 说明 本系列文章以spring-framework-5.3.10为例 , 本篇文章的目的就是使 ...
最新文章
- Mac OS 如何连接windows 文件共享
- 前端工程师有哪些面试技巧值得掌握?
- php ../ 和 ./ 区别,php $_POST 与 php://input的区别分析
- 吴恩达|机器学习作业6.0支持向量机(SVM)
- 黑马程序员--java基础知识注意点收录
- 三菱PLC 串口通信开发心得经验
- 母亲节微信公众号走心文章就用来逗编辑器排版
- 网易云音乐数仓模型设计实践
- 金属重量计算机在线,金属重量计算器
- CAXA 分解命令x 解决不能选中图形问题。
- 第二章 让你的kali系统变得更好用
- 如何获得一个RAC Oracle数据库(从Github - oracle/docker-images) - 本地版
- android tv 下载地址,Android TV获取所有的应用apk
- 搭建vpn linux,vpn在linux下搭建
- 第1章 当我们谈论算法的时候,我们在谈论什么?
- BOJ 427. 学姐逗学弟
- 专精特新企业认定条件 这些条件要满足
- Android 基于Socket的聊天室
- 高德搜索POI:以获取小区数据为例
- 超级计算机图像处理云桌面,图形工作站高性能云桌面解决方案
热门文章
- 那些兼职中你不知道的事
- 回收二手木料,是一个利润比较大的项目
- 为什么现在的游戏笔记本那么贵,动不动就上万块,组装机不好吗?
- CPU里都有几十亿个晶体管,万一坏掉几个还能用吗?
- oracle执行外部sql_增强的PolyBase SQL 2019-Oracle DB的外部表
- sql server 群集_SQL Server 2014 –安装群集实例–分步(3/3)
- 如何使用sqlpackage和PowerShell将示例bacpac文件导入到Azure SQL数据库
- sql安装弹出sqlcmd_SQL Server中SQLCMD实用工具概述
- easyui的下拉框combobox在包含的iframe页面里点击不能收回解决办法
- android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds区别