springAOP这些基础概念,你真的清楚吗?
01引子
spring框架对于java的重要性不言而喻,如果你对spring比较熟悉,那么AOP的大名是不是也是如雷贯耳,不管是在日常开发还是面试过程中,AOP是你绕不过的一座大山,今天我们就和大家一起聊聊aop中的一些比较重要且容易混淆的一些概念,希望能通过这篇文章能让大家对aop有更深入的了解。02javaaop代码实例
如果没有看过springaop的官方文档,我建议你先看一下官方文档再来看这篇文章效果会更好点。
先看以下代码(代码有点长,如果暂时看不懂可以跳过代码)packagecom。wyc。dream。springlearnrelated。Aop。aspect;importorg。aspectj。lang。ProceedingJoinPoint;importorg。aspectj。lang。annotation。;importorg。springframework。context。annotation。EnableAspectJAutoProxy;importorg。springframework。stereotype。Component;author:wangyuancundescription:注解方式定义切面date:202252EnableAspectJAutoProxyComponentAspectpublicclassAnnotationsLogAspect{definespointcutPointcut(execution(com。wyc。dream。springlearnrelated。Aop。。(。。)))privatevoidpointCutMethod(){}环绕通知parampjpreturnthrowsThrowableAround(pointCutMethod())publicObjectdoAround(ProceedingJoinPointpjp)throwsThrowable{System。out。println();System。out。println(环绕通知:进入方法);Objectproceedpjp。proceed();System。out。println(环绕通知:退出方法);returnproceed;}前置通知Before(pointCutMethod())publicvoiddoBefore(){System。out。println(前置通知);}后置通知paramresultAfterReturning(pointcutpointCutMethod(),returningresult)publicvoiddoAfter(Stringresult){System。out。println(后置通知,返回值:result);}异常通知;parameAfterThrowing(pointcutpointCutMethod(),throwinge)publicvoiddoAfterThrowing(Exceptione){System。out。println(异常通知,异常:e。getMessage());}最终通知After(pointCutMethod())publicvoiddoAfter(){System。out。println(最终通知);}}packagecom。wyc。dream。springlearnrelated。Aop;JDKAOP接口publicinterfaceIJdkProxyService{方法一无返回结果;voiddoMethod1();方法二有返回结果returnStringdoMethod2();有返回结果并返回异常;returnthrowsExceptionStringdoMethod3()throwsException;}packagecom。wyc。dream。springlearnrelated。Aop。service;importcom。wyc。dream。springlearnrelated。Aop。IJdkProxyService;importorg。springframework。stereotype。Service;author:wangyuancundescription:java类作用描述date:202251ServicepublicclassJdkProxyServiceImplimplementsIJdkProxyService{OverridepublicvoiddoMethod1(){System。out。println(jdkProxyServiceImpl。doMethod1()。。。。。。);}OverridepublicStringdoMethod2(){System。out。println(JdkProxyServiceImpl。doMethod2()。。。。。。);returndoMethod2();}OverridepublicStringdoMethod3()throwsException{System。out。println(JdkProxyServiceImpl。doMethod3()。。。。。。);thrownewException(someexception);}}lt;?xmlversion1。0encodingUTF8?beansxmlnshttp:www。springframework。orgschemabeansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlns:contexthttp:www。springframework。orgschemacontextxmlns:aophttp:www。springframework。orgschemaaopxsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans。xsdhttp:www。springframework。orgschemacontexthttps:www。springframework。orgschemacontextspringcontext。xsdhttp:www。springframework。orgschemaaophttps:www。springframework。orgschemaaopspringaop。xsd!beandefinitionscontext:componentscanbasepackagecom。wyc。dream。springlearnrelated。Aopbeanspackagecom。wyc。dream。springlearnrelated。Aop。test;importcom。wyc。dream。springlearnrelated。Aop。IJdkProxyService;importorg。springframework。context。support。ClassPathXmlApplicationContext;author:wangyuancundescription:java类作用描述date:202252publicclassBaseAnnotationsJDkAopTest{publicstaticvoidmain(String〔〕args){ClassPathXmlApplicationContextcontextnewClassPathXmlApplicationContext(annotationAspects。xml);IJdkProxyServicejdkProxyServicecontext。getBean(IJdkProxyService。class);jdkProxyService。doMethod1();jdkProxyService。doMethod2();try{jdkProxyService。doMethod3();}catch(Exceptione){}}}
结果如下:
执行结果
上面这一段代码是基于AspectJ注解写的一个简单的springaop的小例子,如果暂时还看不懂没关系,我们继续往下看,最后再回过头来看上面的代码会更明白一点。03相关概念
首先我们要清楚两件事,什么是SpringAOP以及SpringAOP有什么价值或者说学这个springAOP可以解决我们什么样的问题;什么是SpringAOP?
在这里我们先看一下spring官方对这个springAOP是怎吧怎么解释的,如下:AspectorientedProgramming(AOP)complementsObjectorientedProgramming(OOP)byprovidinganotherwayofthinkingaboutprogramstructure。ThekeyunitofmodularityinOOPistheclass,whereasinAOPtheunitofmodularityistheaspect。Aspectsenablethemodularizationofconcerns(suchastransactionmanagement)thatcutacrossmultipletypesandobjects。(SuchconcernsareoftentermedcrosscuttingconcernsinAOPliterature。)
OneofthekeycomponentsofSpringistheAOPframework。WhiletheSpringIoCcontainerdoesnotdependonAOP(meaningyoudonotneedtouseAOPifyoudon’twantto),AOPcomplementsSpringIoCtoprovideaverycapablemiddlewaresolution
翻译过来大概的意思是:AOP是一种面向切面的程序设计结构,它提供了程序结构的另外一种思考,在OOP(面向对象)中的基本单元是类,而在AOP中基本单元则是切面,切面支持跨多种类型和对象的关注点(例如事物管理)的模块化。Spring的一个关键组件是AOP框架,虽然SpringIoc容器并不依赖AOP(这就意味着如果你不想使用AOP,则不需要使用AOP),但是AOP补充了SpringIOC,从而提供了一个非常强大的中间件解决方案;
接下来我谈一谈我个人对这句话的理解(如果说得不对,直接喷我):
OOP引入了封装,继承和多态的概念,以建立一个对象层次结构,该对象层次结构允许开发人员定义垂直结构,但是不适合定义水平关系,而AOP则是针对业务处理过程中的切面进行提取(何谓切面则在下面有讲解),以便获得逻辑过程各部分的低耦合的效果。
OOP和AOP的区别
2。在Spring框架中使用SpringAOP来做什么?
在这里我们也先看一下官方网站对这个怎么解释的,如下:Providedeclarativeenterpriseservices。Themostimportantsuchserviceisdeclarativetransactionmanagement。
Letusersimplementcustomaspects,complementingtheiruseofOOPwithAOP
翻译过来大概的意思是:提供声明性的企业服务。这类服务中最重要的是声明性事务管理;让用户实现自定义切面,用AOP补充它对OOP的使用;
上面这话说得有点抽象,我们来举个实际点的例子来说一下,比如你创建了一个spring项目,将其发布到了生产环境,之后陆陆续续收到性能告警,这个时候你需要查明哪些api响应比较耗时,这个时候你需要将每个方法都打上如下类似的日志:longstartTimeSystem。currentTimeMillis();执行相关业务代码开始。。。。。。执行相关业务代码结束;longfinishTimeSystem。currentTimeMillis();DurationdurationDuration。ofMillis(finishTimestartTime);logger。info(String。format(Durationofsexecutionwass,pjp。getSignature(),duration));
如果真这样干的话,会遇到两个问题,一个是如果方法特别多的话,你打日志的时间就比较耗时,第二个是一旦写的地方多了就容易出错和不利于维护。
这个时候我们就可以利用AOP把这些横切关注点(也就是记录耗时的日志代码)从实际业务代码中分离出来并进行模块化。
例子
读到这里你应该对AOP有了一定的认知,知道他是什么和干什么的,如果还是有点不太明白,建议把spring官网有关AOP的部分再重新读一读,接下来我们聊一聊关于AOP的一些术语,这部分有点晦涩难懂,我会尽量说的直白一点。(这些术语不是特定于Spring的)Aspect(切面):跨多个类的关注点的模块化,其实就是上面说的日志等公共组件,说的再简单一点就是使用Aspect注释的常规类(这里说的有点不严谨,除了这个Aspect注释,还有就是基于XML定义的)Joinpoint(连接点):程序执行过程中的一个点,如方法的执行或者异常的处理,在springAOP中,连接点始终表示方法的执行。其实说白了就是你要进行增强,你在哪里增加,在哪个方法上进行增强,在哪里干Pointcut(切入点):我们知道在spring中我们要在连接点上进行增强,也就是在所谓的方法上进行增强,但是在哪个方法上进行增强呢,这个时候我们就需要用到切入点的概念了,切入点的作用就是提供一组规则来匹配joinpoint,让你知道在哪里进行增强,也就是在哪里干的条件,spring默认其实使用了Aspectj切入点表达式语言。advice(通知):上面通过joinpoint和Pointcut知道了在哪里干,这个advice就是接下来干什么,它包括了前置通知(beforeadvice),后置通知(afteradvice),环绕通知(aroudadvice)等,这些通知我就不一一赘述了,有兴趣的朋友可以去官网上看看。Introduction(引入):Springaop允许您向任何被建议的对象引入新的接口(以及相应的实现)。例如,您可以使用介绍使bean实现IsModified接口,以简化缓存Targetobject(目标对象):这个其实也很好理解,也就是被织入横切关注点的对象,由于springaop是使用运行时代理实现的,所以该对象始终是一个代理对象(SinceSpringAOPisimplementedbyusingruntimeproxies,thisobjectisalwaysaproxiedobject)。AOPproxy(AOP代理):在springaop中,一个AOP代理是一个JDK动态代理对象或者CGLIB对象(springaop默认使用标准的JDK动态代理作为AOP代理,如果业务对象没有实现接口,则使用CGLIB)Weaving(织入):把切面连接到其他的应用程序或者对象上,并创建一个被通知的对象,这些可以在编译时,类加载时和运行时完成。spring和其他javaAOP框架一样,在运行时完成织入。(ikeotherpureJavaAOPframeworks,performsweavingatruntime)。04说个故事
从前有一个北海边的小国,在一个月黑风高的夜晚,这个小国发生了一桩命案。
但是这个凶手很是狡猾,在行凶之后并没有留下什么有价值的线索,就在大家一筹莫展之时,一个自称是打更人的老者说自己在无意中看到了凶手整个行凶过程,但是因为行凶者戴着面具,并没有看到凶手具体长什么样。只知道这个凶手是个男性,身高约七尺有五。
国王听完描述完之后随即对士兵说:凡是身高七尺五的男性都抓过来严刑拷打,士兵们只好按照国王的要求把所有符合条件的人都抓了起来进行拷问;
现在我们来分析这个故事和springaop的对应关联关系。
首先我们知道,在springaop中joinpoint指的是所有的的方法的执行,而Pointcut则是joinpoint的谓词来描述那些joinpoint可以被植入advice。在这个小故事中这个北海国的老百姓就是joinpoint,而pointcut则是打更人老者描述的凶手的特征:高七尺五的男性。
而advice则是施加在嫌疑人身上的动作:抓起来进行拷问;
听完这个故事现在你对springAOP的概念清楚了嘛?
无视联盟顶级内线戈贝尔,而选择自己刷数据,这样的米切尔真自私2021年夏天,ESPN、体坛画报等美国权威媒体照例发布了他们眼中的NBA百大球星。米切尔和戈贝尔系数在列,这不仅是对他们实力、表现以及未来发展潜力的肯定,也为渴望捧起N……
关于描写动植物的作文篇一星期天妈妈给我买了两只小乌龟。小乌龟的样子很可爱。身体大约有10厘米长,上面有很多绿色的花纹;扁扁的头上长着一双黑豆似的眼睛;它的脖子能伸得很长,皮肤很粗糙;它……
查出癌症先别慌,做好这三件事,能大大延长寿命一旦查出癌症慌了,认为赶上了绝症。其实并非如此,随着医学技术的发展,癌症治疗方案的改进,以及新药研发、早期筛查等,多种癌症的死亡率已经显著下降,癌症患者的寿命得到延长。有不少癌……
补肾不健脾,到最后还是空欢喜一场!看中医一方帮你脾肾同补一个月前,我接诊了一位患者,林先生,41岁,这个患者有隐疾的情况三四年了,虽然自己也买了很多补药,但是效果一直不见好,情况反反复复的,以致于现在信心不在,但是刚40出头的年纪,……
小学生作文Q版西游话说唐僧四人在去往西天取经途中来到盘丝洞附近。突然,唐僧突然看见了七个美女在洗澡,便两眼发光,趁徒弟们还没发现有美女洗澡,便叫徒弟们让开,说要嘘嘘(其实是看七个美女洗澡罢……
国货进击正当时,新锐国货溪木源一举拿下天猫618多个榜单第一天猫新锐国货护肤品牌NO。1、8分钟超越去年同期24小时销售额、20分钟刷新去年销售记录、全渠道同比去年896。溪木源618大促战报这是新锐护肤品牌溪木源在本次61……
五十岁的女人护肤有讲究,这5样护肤品多用用,比同龄人更显年轻有句名言说得好:世界如一面镜子,皱眉视之,它也皱着眉看你;笑着对它,它也笑着看你。我们看到的世界其实就是我们自己的模样,你怎么对待世界,世界就怎么对待你。女人在到了50岁……
骑自行车的作文300字前几天,我刚学会骑自行车,爸爸跟我说了N遍让我骑车上路锻炼锻炼。我才不呢!法律规定12岁以下的儿童不能骑自行车上路,我才不上他的当呢!今天,他又跟我说,我实在在家闷了,就不管三……
八宝鸭,烧椒墨鱼仔,尖椒肥肠,蹄花鸡,灌汤酥排,酸菜肘子,生每一天,美食都在打开味蕾和未来,简单质朴的味道连接着故乡水土,汇聚成故乡味,让日常生活中的人们可以耽于片刻的享受与迷醉,每日餐食都可宛若仪式。下面就给大家介绍一组简单质朴的家常……
五花肉最火爆的吃法,不油炸也不煎,比红烧肉好吃,比扣肉香五花肉相信大家都很喜欢吃,像我就特别喜欢吃五花肉,尤其是上五花肉,肥肉瘦肉错综相间,把它用来做成红烧肉,或者是用来做成扣肉的话,味道都是非常好吃的,你喜欢吃五花肉吗?如果……
生命之旅作文大连一个给了我记忆深刻的城市。之所以深刻,除了那使人心旷神怡的景色之外,更主要的是它让我认识了一个深刻的哲理。记得那是在五年级的时候,学校组织同学们到大连旅游。乍到大连,……
5个治疗急性肾小球肾炎的药膳方,简单好吃又有效急性肾小球肾炎(简称急性肾炎)是由免疫反应而引起的弥漫性肾小球损害。绝大多数属于链球菌感染后肾炎。是一种常见病、多发病。是急性疾病,以血尿、水肿、蛋白尿、高血压为主要临床症状的……
小学生动物园春游作文500字春游作文第1篇:这里有数不胜数的动物;这里有好玩极致的乐园;这里有令你难忘的事,这里就是mdash;mdash;长隆野生动物园!我们驾车ldquo;长驱直入rdqu……
爱情和颜值无关?娜扎表白被拒,李易峰两度失恋,李若彤也被甩过艺人因为颜值高,收入也不菲,还被众多粉丝捧着,所以大家自然而然地觉得他们并不缺乏追求者,在情路上应该都比较顺利,没有受过太多情伤。但其实无论是颜值多高的男神、女神或多或少……
有一种悲哀叫做贫穷小学生作文400字我救了19条生命,可有谁来救救我的命一个农民在死前躺在病床上不断喃喃的重复这句话。这个农民叫金有树,是重庆一个普通的人,几年前因跳水救了19名落水者而留下了病根。面对巨额的医疗……
亮剑观后感《亮剑》一经上映即引起较大轰动,作为一部革命影视,《亮剑》不仅给观众展现了历史往事,更重要的是刻画了李云龙这一典型人物,下面就是品学网小编给大家整理的亮剑观后感,希望大家喜欢。……
世界最美黑人超模惊艳全网!但最传奇的还是她的这段爱情真正的美人到底是什么样?不同的人有不同的回答,但当看到伊曼鲍伊的时候,一定都会不约而同认为,她就是这个问题的正确答案。那曼妙灵动的天鹅身躯,仿佛古老壁画般的不朽容颜……
夏天适合吃蒸菜,少油烟又清淡!推荐6道家常蒸菜,好吃不上火导语:夏天适合吃蒸菜,少油烟又清淡!推荐6道家常蒸菜,好吃不上火夏天到了,天气越来越热,厨房将会变成一个巨大的蒸笼,待在里面做饭实在难受,而且好不容易做好了,却没有了食欲……
7。39万元起,顶配车型配备L2级驾驶辅助,2022款零跑T文:懂车快报杨万科随着新能源汽车的发展,尺寸小巧的纯电动车也逐渐成为了消费者们购车的新选择,而且有的车型还正朝着高端化发展,不再满足于仅能日常代步的交通工具,而是参与到用……
难忘的一夜高中叙事作文一年结束了,在除夕夜是团圆夜,家家户户都张灯结彩的,庆祝一年平安结束,新的一年好的开始。在除夕这天,家家都忙着贴春联,我们家也不例外,而且每年家里的对联还是由我来贴的。其……
暑假趣事日记400字篮球比赛这个暑假,我和表哥一起参加了篮球培训班,经过长时间的刻苦训练,我和表哥终于小有成就。时间过得真快啊!一转眼,就到了最后的一节篮球课了,我们做完热身运动后,没有像往常一样进……
关于植树节的英语作文范文带翻译种柳树一天,我和我的两个表哥去我外婆家去种柳树。外婆听我们说要种树,就给我们指了一块需要种树的空白地让我们种树。开始挖树坑了,但是,只有一个铲子,怎么办呢?我想了一个办法,是我们三人……
致老班岁月就是这么不饶人,转眼间我已经跨入初三两个月了。回头看看八年级是时候,我真的觉得对不起自己,因为那是真的是在浪费时间,原因也有很多:班级的氛围不是很好,自己的自觉心也不够,老……
清华邢春晓新一代ICT驱动元宇宙赋能数字经济社会,元宇宙尚在5月27日,中民协元宇宙工委、元宇宙共同体、中国金融信息中心和北京时间有限公司联合主办的《元宇宙赋能实体经济峰会》顺利召开,多位专家为元宇宙发展建言献策。在峰会上,清华大……