当前位置: 首页 > news >正文

JAVA-AOP底层原理

AOP即面向切面编程,他的基本单元就是一个切面,相比于OOP他的思想主要是对方法功能进行封装,使得它可以通过配置方式灵活的切入到某一批目标对象方法中,它可以看作是原始类的增强,为其添加了额外的功能,一般用的比较多实在事务管理、日志和缓存。

AOP分为两种一个是静态代理一个是动态代理,也就是AspectJ和SpringAOP,静态代理是在编译阶段将Aspect植入Java字节码中,运行的时候就是增强之后的AOP对象。

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

而实现这个过程有两种方式一个是JDK动态代理一个是CGLIB动态代理,两者的触发条件有所不同,如果需要被代理的类实现了一个接口那么就是使用JDK动态代理,否则就是CGLIB动态代理,也可以通过@EnableAspectJAutoProxy注解显示配置使用CGLIB;

JDK动态代理流程大概是在类加载过程中会动态生成代理类Proxy,他是在内存直接生成字节码并通过类加载器加载到JVM中,然后再类的初始化的过程,代理类会实现目标类的接口并持有一个InvocationHandler接口的实例,然后再调用代理对象方法的时候,JVM会将其转发到InvocationHandler的invoke()方法中,然后执行切面逻辑和目标方法的调用,当代理对象不再被引用的时候,JVM的垃圾回收期会将其标记为可回收对象,并回收其内存。

CGLIB动态代理流程大概是在类加载过程中通过Enhancer类动态生成目标类的子类作为代理类,在类初始化时会继承目标类并重写目标方法,同时代理类还会持有一个MethodInterceptor的实例并创建出代理对象,当调用被代理对象方法时,JVM会将其转发到MethodInterceptor的intercept方法上执行切面逻辑和目标方法的调用,随着不被引用也会被回收。

总的来说JDK动态代理和CGLIB动态代理最大的区别就是一个时通过“反射机制”创造一个包含了目标类方法的增强类实现切面逻辑和原始逻辑,一个则是以子类继承的方式并额外持有增强实例调用切面逻辑和原始逻辑。

参考:Java AOP的底层实现原理 - 健人雄 - 博客园

相关文章:

  • 每日一题——买卖股票的最佳时机
  • SQL Server数据库慢SQL调优
  • 《认知觉醒》改变的核心方法论
  • 【Java基础巩固系列】异常
  • 【Android】安卓 Java下载ZIP文件并解压(笔记)
  • Python中Requests的Cookies的简单使用
  • 2025-03-19 学习记录--C/C++-C语言-单链表的结构体定义 + LNode * 和 LinkList 的区别
  • 【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)
  • 【工具类】Java的 LocalDate 获取本月第一天和最后一天
  • Linux killall 命令使用详解
  • Springboot项目集成maven-assembly-plugin进行打包
  • Kubeasz工具快速部署K8Sv1.27版本集群(二进制方式)
  • Angular 2 JavaScript:深度解析与实战指南
  • Python 编程题 第十一节:选择排序、插入排序、删除字符、目标移动、尾部的0
  • AI Agent深度进化论:从多模态感知到自主决策革命的行业落地全景透视
  • 【PCB工艺】电流、电压与电阻的关系 以及 含有电容和电感的电路
  • HTML基础内容3
  • 胜科纳米上市在即:营收连增多年,失效分析、材料分析技术市场领先
  • 极简桌面待办清单软件,❌不会增加工作量
  • 遗传算法+四模型+双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测
  • 看着不爽就滚蛋!郑州大学第一附属医院一科室公众号被曝运营人员辱骂他人
  • 朝中社:美在朝鲜半岛增兵将进一步增加其本土安全不确定性
  • 经济日报:仅退款应平衡各方权益
  • “五一”假期首日迎出游高峰:火车站人流“堪比春运”,热门景区门票预订量同比增三成
  • 央行4月开展12000亿元买断式逆回购操作
  • 78家公募年度业绩比拼:23家营收净利双升,十强座次微调