图文详解 Spring AOP,看完必懂!_世界聚焦
AOP产生背景
使用面向对象编程 ( OOP )有一些弊端,当需要为多个不具有继承关系的对象引人同一个公共行为时,例如日志、安全检测等,我们只有在每个对象里引用公共行为,这样程序中就产生了大量的重复代码,程序就不便于维护了。
所以就有了一个对面向对象编程的补充,即面向方面编程 ( AOP ), AOP 所关注的方向是横向的,区别于 OOP 的纵向。
什么是AOP什么是面向方面编程,3个过程:
(相关资料图)
找到横切点:首要目标确定在程序的哪个位置进行横切逻辑横切逻辑(业务代码):横切逻辑代码,这个就是横切业务代码,与aop无关织入:将横切逻辑织入到横切点开发者主要关心的是横切逻辑的编写,只需要很少的代码编写确定横切点有哪些,而不需要去为每个横切点添加横切逻辑,不然就是面向对象编程了。
既然是横向的编程,那么在我们的程序中,哪些可以作为横线切入点呢?
看下示例代码:
publicclassTest{publicstaticvoidmain(String[]args){//@1Bb=newB();//@2b.method();//@3B.say();}staticclassB{//字段//@4privateStringname;//构造方法public(){//@1.1}//对象方法publicvoid(){//@2.2}//静态方法staticvoid(){//@3.3}}}
所以我们可以将横切点主要分为两大类:字段、方法。方法又分为很多种,
横切点有很多地方,从代码上看得见的,有如下几个地方:
使用构造函数创建对象构造函数执行对象方法调用对象方法执行静态方法调用静态方法执行反射读写对象字段目标1:找到横切点
那么怎么去定义一个横切点呢?怎么用一个接口来描述一个横切点呢?
在Java中,一切皆对象,在Java中一个类有2方面内容:字段、方法(构造函数、对象方法、静态方法),java中使用AccessibleObject来抽象公共行为。方法:就是一段可以执行的程序,一段代码。
所以在横切点接口中,首先一个功能就是返回给用户当前横切点,有两种情况:
如果横切点作用于对象(对象字段、对象方法、构造函数),则不仅需要返回AccessibleObject,还需要返回当前对象,因为调用通过反射调用对象方法需要传入当前对象。如果横切点作用于类,则仅返回AccessibleObject即可。另一个接口功能就是要不要考虑在横切点来控制多个横切逻辑的调用。这个可以有框架支持,也可以由横切点控制。这对应的就是责任链模式的API设计。比如tomcat中的Filter链式调用就是以集合形式调用;netty中的Handler组织就是以链表形式。如果是以集合形式调用,则在横切点接口需要定义一个方法来链式调用。(aop联盟的JoinPoint采用是集合形式调用)
那么AOP联盟使用JointPoint接口来定义横切点。
publicinterfaceJoinpoint{Objectproceed()throwsThrowable;ObjectgetThis();AccessibleObjectgetStaticPart();}
Object proceed() throws Throwable
: 链式调用横切点
Object getThis();
返回连接点当前对象。如果当前连接点是静态,比如静态方法,则该方法返回null,因为反射不需要对象,而且静态方法是通过类调用的,压根就没有对象,所以返回null。spring aop不支持静态方法的拦截,所以在spring中这里返回的就是目标对象(被代理对象)
AccessibleObject getStaticPart();
返回连接点静态部分,对于连接点是方法,返回的就是Method对象。
现在对连接点的设计比较清晰了,然后就是对连接点的扩展了,比如可执行程序(构造方法、Method)的子接口,字段的子接口(aop联盟没有定义,只有方法级别的)。
AOP联盟对连接点接口的设计:
比如在MethodInvocation,就是返回Method。
增强的抽象,其实就需要连接点信息,毕竟增强是要投入到一个地方的,所以需要连接点信息。
在aop联盟的接口定义:
Advice作为一个tag标识,在aop联盟中使用拦截器来作为增强的命名,这里完全可以去掉Interceptor,而直接定义一个MethodAdvice。之所以定义为Interceptor,是因为拦截器命名更符合编程命名规范,让人从命名就知道接口功能。
在MethodInterceptor,传入连接点信息(因为是方法拦截,所以这里是方法级别的连接点接口定义)
Objectinvoke(MethodInvocationinvocation)throwsThrowable;
首先就是怎么织入。织入由两种方案。
静态织入:采用自定义类加载器机制。自定义类加载器根据织入规则在加载class文件期间对class文件动手织入横切逻辑,然后将改动后的class文件交给JVM运行。动态织入:由多种选择,动态代理(JDK Proxy)、动态字节码生成技术(cglib)spring采用动态织入。动态织入就是生成代理对象,代理对象中维护了当前连接点所有拦截器,然后调用目标方法时被代理类拦截,在代理类中作aop功能。
来一个完整的流程图:
Spring AOP的实现基于AOP联盟接口标准设计实现的,全局看下aopalliance有哪些接口以及接口的API设计,我们上面已经分析完了。
AOP联盟的接口很少:
关键词:
相关阅读
-
图文详解 Spring AOP,看完必懂!_世界聚焦
AOP产生背景使用面向对象编程 ( OOP )有一些弊端,当需要为多 -
今日热搜:各种项链绳的编法图解视频 ...
1、1.准备两条线,用作项链的链绳。2、2.在这两条线的中间位置穿一个 -
天天播报:水浒传扈三娘的结局是什么?水...
水浒传扈三娘的结局是什么?在《水浒传》中扈三娘最终死于方腊部下郑彪 -
微头条丨美元兑欧元周五上涨 美联储需...
周日(6月25日)亚盘,美元指数最新价报102 87,开盘价为102 41。美元 -
从“小事”做起推进基层治理
原标题:从“小事”做起推进基层治理基层治理是国家治理的最末端,... -
阿里本地生活能够喘口气了吗?
最近,本地生活的战争再次升级。面对抖音的强势进攻,美团进入反击状态 -
鲍鱼蒸多长时间最好吃窍门_鲍鱼蒸多长时...
1、将鲍鱼用热水烫一下,然后立即放入冷水中停止加热,并用牙刷将鲍鱼 -
【世界速看料】乌克兰军队利用莫斯科动...
据美国有线电视新闻网(CNN)报道,乌克兰国防部副部长汉娜·马利亚... -
每日简讯:望城区市政管理局(关于望城...
1、望城区市政管理局前身为望城县城镇管理局,成立于2001年12月,2005 -
定点运输(关于定点运输介绍)
大家好,小万来为大家解答以上的问题。定点运输,关于定点运输介绍这个 -
温州糯米山药的营养价值(温州糯米山药...
温州糯米山药的营养价值,温州糯米山药这个很多人还不知道,现在让我们 -
沪苏地铁互通 长三角核心城市深度同城化
沪苏地铁互通长三角核心城市深度同城化 -
亚马逊云拟拨款1亿美元建AIGC中心 与谷...
亚马逊云业务部门AWS表示,将拨款1亿美元建立一个中心,帮助企业使用生 -
迷你世界黑科技教程刷迷你币_迷你世界黑...
1、比起自己做黑科技,最简单的就是下载迷你世界黑科技软件。2、迷你世 -
衡东县警方为营商环境保驾护航
金觉峰风电场为石滩派出所送来锦旗,以示感谢。红网时刻衡阳6月24日 -
信用卡欠8万逾期两年有什么后果?银行停...
信用卡欠8万逾期两年有什么后果?1、产生违约金,一般是最低还款额, -
玩法“上新” “暑期档”旅游持续升温
六月的夏日充满毕业季独有的青春气息,随着中高考结束,“暑期档”... -
微视频|大地诗篇|独家
土地,是万物之源、立国之本,是“大国粮仓”的根基。6月25日是第33... -
苹果12上市时间官方售价_苹果12上市时间...
1、【iPhone12上市时间】在经历了9月份的虚晃之后,苹果终于在10月份推 -
全球热推荐:皮皮虾怎么下载视频无水印_...
皮皮虾无法下载无水印视频,需要使用第三方软件进行水印。以水印宝为例