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

Spring AOP

Spring AOP

面向切面编程。
解决问题:解决进行事务处理、日志记录等操作时同样的代码分散到各个方法中。增加开发人员的工作量,提高了代码的出错率。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
在这里插入图片描述

关键词

切面(Aspect)

切面是一个包含通知和切点的对象,通知(即增强)和切点的结合。主要用来维护切点和通知之间的关系。AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中。AOP的工作重心在于如何将增强织入目标对象的连接点上,。可以简单地认为, 使用 @Aspect 注解的类就是切面.

连接点(Join Point)

在应用执行过程中能够插入切面的一个点。(注:就是抽象的「切点」声明所指代的那些具体的点。)可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。

切点(point cut)

切点(Pointcut ):一组连接点的总称,用于指定某个增强应该在何时被调用。提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice .Pointcut 通常包含了一系列的Joint Point,我们可以通过pointcut来同时操作jointpoint。单从概念上,可以把Pointcut 当做jointpoint的集合
advice 是在 Join point 上执行的, 而 point cut 规定了哪些Join point可以执行哪些 advice

通知(Advice)

指拦截到连接点后要执行的代码,包括 @Before、@AfterReturning、@AfterThrowing、@After 和 @Around 五种类型。

织入(Weaving)

将切面应用到目标对象来创建新的代理对象的过程。在 Spring AOP 中,织入可以在编译时、类加载时和运行时进行。

核心注解

  • @Aspect:定义一个切面
  • @PointCut:定义切点
  • @Before:定义前置通知
  • @AfterReturning:定义后置通知
  • @Around:定义环绕通知
  • @AfterThrowing:定义异常通知来处理程序中未处理的异常
  • @After:定义最终final通知
  • @DeclareParent:定义引介通知

原理

AOP的实现原理是动态代理,动态代理可以由Jdk动态代理或者Cglib动态代理实现,调用需要增强的方法,实际上是调用了代理类的方法,由代理类执行业务逻辑。
jdk 代理
一种基于接口的代理,通过实现 InvocationHandler 实现对代理类方法的调用。只能代理实现了接口的类,在运行时通过生成代理类的方式来实现。
cglib字节码增强
基于继承的代理,通过生成代理类来完成对目标对象方法的调用。CGLIB 代理不需要实现接口,对目标对象进行继承并重写其中的方法,从而实现对方法的调用拦截。

java代理

http://www.xdnf.cn/news/14627.html

相关文章:

  • csv文档批量转换xlsx,xls文档(带界面)
  • Go语言同步原语与数据竞争:数据竞争的检测工具
  • 2011-2020年各省互联网接入端口数数据
  • 打卡day54
  • AC-MT
  • C语言常用库函数
  • LangChain面试内容整理-知识点14:工具包(Toolkits)与用法
  • 生成对抗网络(GANs)入门介绍指南:让AI学会“创造“的魔法(二)【深入版】
  • Textacy:Python 中的文本数据清理和规范化简介
  • 自我实现的量子隐喻:在可能性场域中动态拓展涌现节点
  • LLMs:《WebDancer: Towards Autonomous Information Seeking Agency》翻译与解读
  • 02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序
  • Sa-Token全面深入学习指南
  • 【慧游鲁博】【15】后台管理系统功能完善:仪表盘、多模态交互日志、简单问答词条管理
  • 建造者模式Builder Pattern
  • 深度解析5W2H:高效思维与问题解决工具详解
  • 离散隐藏变量下期望最大化(EM)算法的简化
  • LeetCode 第77题:组合
  • SimpleQtLogger 使用总结
  • 深入理解滑动窗口算法:原理、应用与 C++ 实现
  • C# 事件详解
  • React组件通信——发布订阅(pub/sub)
  • 紧急救援!Ubuntu崩溃修复大赛
  • 在Qt中使用OpenGL显示大量点(点云)
  • 136. 只出现一次的数字
  • 算法题(力扣每日一题)—改变一个整数能得到的最大差值
  • Arthas 全面学习指南
  • 动手实践:LangChain流图可视化全解析
  • [从0到1]环境准备--anaconda与pycharm的安装
  • Linux系统firewall-offline-cmd命令在企业网络安全防护中的应用案例分析