Bootstrap

切面环绕通知异常没有返回值 导致404_国庆假期还能这样通知我?

我替你吐槽一句:这B是个标题党,上当了,快跑

别跑,既然来了,就看完这篇文章顺便学个知识,不香吗

       9f2be11a8705b0faee8f1be57b96934a.gif

关于Spring Ioc和Aop,之前说过也,这是Spring的基础

  • Spring IOC知识点一网打尽

  • Spring AOP原来这么简单啊

我自己都想吐槽我前面文章的排版真烂,虽然现在也不咋地,但是我觉得比之前的好点了,最起码我更用心

不管你是否点赞关注,我都用心给你写!

是这样子的,最近公司接了一个老系统,需要进行后期的维护和版本迭代,说是迟,那是快,我连老系统代码都没看几眼,都没给时间看,产品直接肝了一个版本的新需求,怼你脸上了,说是1.4.8版本必须尽快跟上,不跟上就杀程序员祭天

产品是这样说的,你把熟悉系统和产品开发的时间加一起预估下需要多久,OK我给出了个时间(我可没有瞎给时间,我觉得时间合理,毕竟完全是新代码,连多看一眼都没有)

产品:不行,时间太久了

我:!@#¥%……

产品:需要提速,你重新估一下最好

我:OK,减少一天

暂时这么定了,过了段时间,又来,还是时间长,又干掉一天,我本来开心写代码的脸上的笑容逐渐消失,内存&……%¥#

         70546154f54adc2d855259819053d086.png

当然,这只是其中的小细节哈,其实你只要正常开发,遇见什么问题多沟通,其实还是可以的,只要不是紧急问题,不会耽误项目进度,一般还是可以的,所以这种问题大家内心自己估

AOP

先来回顾下AOP一起

  • AOP思想就是面向切面编程,解开对象内部,以增强的方式影响原有功能

  • AOP是一个横向关系,可以降低模块间的耦合度,提取公共代码部分

Spring AOP 解决的就是 对象的功能增强。在不改动原有逻辑的基础上去增强新的功能,以切面的形式开辟一个新角度

通知方法的几种类型:

  • 前置通知(@Before):在我们执行目标方法之前运行

  • 后置通知(@After):在我们目标方法运行结束之后 ,不管有没有异常

  • 返回通知(@AfterReturning):目标方法正常返回值后运行

  • 异常通知(@AfterThrowing):目标方法出现异常后运行

  • 环绕通知(@Around): 需要手动执行joinPoint.procced(),前置通知和后置通知的结合

接下来一起看下其中的一个小细节问题,是涉及到AOP的,我需要拦截老系统中的多个接口,在老接口执行之前执行业务操作,这个显而易见了吧,肯定AOP上啊,舍AOP其谁啊

假设A和B是老接口之一

 @PostMapping("/A") @ApiOperation("登录")public String A(@Valid @RequestBody BaseRequest request) {     String str = "我是A,我要关注这个公众号";     System.out.println(str);} @PostMapping("/B") @ApiOperation("注销")public String B(@Valid @RequestBody BaseRequest request) {     String str = "我是B,我要关注这个公众号";     System.out.println(str);}

我现在需要在A和B接口执行之前都执行我的业务操作,如何做?很简单,AOP来进行切面编程即可,等同于把A和B接口从切面插入,我们可以从老接口的几个位置进行下刀来操作

先上个代码,下面就是添加的相应的AOP的处理

@Before(" execution(* com.cxk.web.controller.类名.A(..)) " +      " execution(* com.cxk.web.controller.类名.B(..)) " )public synchronized void P(JoinPoint joinPoint) {   Smart you = new Smart();   you.see();   you.love();}

来一个一个解释,@Before注解代表在A、B函数执行之前执行P函数,那P函数是如何找到A和B的函数的呢,很简单,用execution表达式来完成即可,括号里面写上函数的路径位置.类名.方法名

不会?教你,找到类的位置,右键

1ef372727a808ad2fed6548773c4e42c.png

然后会让你选择复制哪个路径,选择第三个即可

528e91e3c1e08d1de1c996badc2c30ef.png

然后把\换成.,把.java去掉,再加上方法名即可!

到这里,其实那些神秘的AOP我们完成了,我们可以在P方法中写自己想要的逻辑了,这些逻辑会在A和B方法执行之前来执行

如果有地方调用A函数,便会变成P-->A,B函数也同理;看例子,我们不得先执行P函数中的see()函数看了这篇文章,又执行love()函数爱上这篇文章,然后是A和B,是不是就是该关注这个公众号了呢?

疯狂暗示(PS:你这哪是暗示啊,你这都明示了,明的裤衩子都没了)

        d836decdc1abdbc94c28c3637491f376.png

我们在上面说过有前置通知、后置通知、返回通知、异常通知、环绕通知这几种类型,每一种按照自己的需求来调整即可,我们上面举的例子是前置通知,我们也可以在执行A和B之后(关注公众号之后)进行疯狂点赞、转发、投喂动作,这咋来完成,简单,把@Before改成@After即可

@After(" execution(* com.cxk.web.controller.类名.A(..)) " +      " execution(* com.cxk.web.controller.类名.B(..)) " )public synchronized void P(JoinPoint joinPoint) {   Smart you = new Smart();   you.dainzan();   you.relay();   you.touwei();}

不知道我说明白了没,如果我没说明白,我就再说一遍,就是加了@After之后就可以点赞、转发和投喂了~

         e8772616f03d3fc34781ef46155277f8.png

至于其余几个通知,也是同样的道理,值得一提的是环绕通知@Around,这个是可以把目标函数环绕起来执行,既可以等于前置和后置的结合,但是需要我们手动指定目标函数的执行位置,用joinPoint.procced()即可完成,代表目标函数执行,也可以根据函数要求传入相应的参数

总之,这个东西用起来很简单,但是内部原理才是最应该理解的,最应该关注的,你去找工作,面试官如果问你会不会AOP,你如果只给他扔个例子,他问你原理,你不会,那你完了,告诉你,十成八成凉凉,这基础的原理都不晓得,后续都不用问了,不太理解AOP的静态代理和动态代理的移步我的另一篇即可

其实我在之前的你读完这一篇还不会学Java过来打我!这一篇中也说过关于Spring应该如何准备的,可以读读撒

74a3e81dcecde386ab65fcd311aa3872.png

后置通知

你的八天国庆小假期即将到账,请注意签收

你知道的越多,你不知道的越多,下期见!

2d107605322b28e237958f41197e9b70.png

;