Spring AOP原理「建议收藏」

Spring AOP原理「建议收藏」Spring AOP原理

大家好,又见面了,我是你们的朋友全栈君。

背景

        Spring AOP原理「建议收藏」

   现在我们想要实现接口中的pay方法,在该方法中添加日志记录,安全监测等功能,通用的解决方案即在实现了各个接口的类中添加实现方法。

Spring AOP原理「建议收藏」

   不难看出,这样做我们的很多代码是重复的,有人提出将这些公共的部分写到一个公共的类中,用到的时候分别去调用,这时当公共类中的方法改变时,调用该方法的类都会受到影响,这时我们就可以运用AOP的思想来解决这个问题。

什么是AOP

   AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
   AOP技术恰恰相反,它利用一种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为”Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
   使用”横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

AOP基本概念

   连接点(Joinpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP中表示为“在哪里做”;
   切入点(Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法,在AOP中表示为“在哪里做的集合”;
   增强(Advice):或称为增强在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入增强 ;在AOP中表示为“做什么”;
   方面/切面(Aspect):横切关注点的模块化,比如上边提到的日志组件。可以认为是增强、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现;在AOP中表示为“在哪里做和做什么集合”;
   目标对象(Target Object):需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被增强的对象,从而也可称为“被增强对象”;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为“对谁做”;
   AOP代理(AOP Proxy):AOP框架使用代理模式创建的对象,从而实现在连接点处插入增强(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。
   织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。
   引入(inter-type declaration):也称为内部类型声明,为已有的类添加额外新的字段或方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象), 在AOP中表示为“做什么(新增什么)”


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105692.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月25日 上午8:00
下一篇 2022年4月25日 上午8:20


相关推荐

  • webman_cms发布

    webman_cms发布unicms 有你存在一切安好使用 webman 开发一个 cms 由于时间有限 肯定有很多 bug 举一反三 学习使用吧 记得给我点赞啊 也可以关注我其他作品 PHP 框架 码云仓库 https gitee com lizhiliwo webman cms 查看手册使用注意 public 权限 伪静态 需要服务器开启 fileinfo 功能等 gitclonehttp gitee com lizhiliwo webman cms gitcdwebman cmscomp

    2026年3月17日
    2
  • Java实现QQ第三方登录

    Java实现QQ第三方登录前期准备工作 1 云服务器 2 备案的域名 3 本地调试需要修改 hosts 文件 将域名映射到 127 0 0 1 如何修改 hosts 文件 https www cnblogs com toSeeMyDream p 9313440 html 申请互联 并成为开发者申请互联创建应用时需要备案域名 所以建议提前准备备案域名 互联 https connect com

    2026年3月19日
    2
  • Linux04:(4.6k)vim编辑器「建议收藏」

    Linux04:(4.6k)vim编辑器「建议收藏」文章目录Linux_day04一.vim编辑器vim的三种模式1.命令模式2.末行模式3.编辑模式实用功能扩展内容==1.vim的配置文件==2.异常退出问题3.别名机制4.退出方式补充一些win10下的快捷键Linux_day04一.vim编辑器vim的三种模式命令模式不能对文件直接编辑,但可以通过快捷键删除行,复制,粘贴,移动光标等编辑模式-输入末行模式可以在末行输入命令:搜索,替换,保存,退出,撤销vim打开文件的方式:1.#vim 文件路径——直接打开文件(光

    2022年8月9日
    6
  • Pytest(13)命令行参数–tb的使用

    Pytest(13)命令行参数–tb的使用前言pytest使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败。–tb=style参数可以设置报错的时候回溯打印内容,可以设置参

    2022年7月29日
    8
  • 智谱发布 AutoGLM 2.0:全球首个手机 Agent,云端自主完成任务

    智谱发布 AutoGLM 2.0:全球首个手机 Agent,云端自主完成任务

    2026年3月12日
    4
  • Coze入门教程:用coze手搓agent智能体,让你的agent高质量的处理复杂任务!

    Coze入门教程:用coze手搓agent智能体,让你的agent高质量的处理复杂任务!

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号