我替你吐槽一句:这B是个标题党,上当了,快跑
别跑,既然来了,就看完这篇文章顺便学个知识,不香吗
关于Spring Ioc和Aop,之前说过也,这是Spring的基础
Spring IOC知识点一网打尽
Spring AOP原来这么简单啊
我自己都想吐槽我前面文章的排版真烂,虽然现在也不咋地,但是我觉得比之前的好点了,最起码我更用心了
不管你是否点赞关注,我都用心给你写!
是这样子的,最近公司接了一个老系统,需要进行后期的维护和版本迭代,说是迟,那是快,我连老系统代码都没看几眼,都没给时间看,产品直接肝了一个版本的新需求,怼你脸上了,说是1.4.8版本必须尽快跟上,不跟上就杀程序员祭天了
产品是这样说的,你把熟悉系统和产品开发的时间加一起预估下需要多久,OK我给出了个时间(我可没有瞎给时间,我觉得时间合理,毕竟完全是新代码,连多看一眼都没有)
产品:不行,时间太久了
我:!@#¥%……
产品:需要提速,你重新估一下最好
我:OK,减少一天
暂时这么定了,过了段时间,又来,还是时间长,又干掉一天,我本来开心写代码的脸上的笑容逐渐消失,内存&……%¥#
当然,这只是其中的小细节哈,其实你只要正常开发,遇见什么问题多沟通,其实还是可以的,只要不是紧急问题,不会耽误项目进度,一般还是可以的,所以这种问题大家内心自己估
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表达式来完成即可,括号里面写上函数的路径位置.类名.方法名
不会?教你,找到类的位置,右键
然后会让你选择复制哪个路径,选择第三个即可
然后把\换成.,把.java去掉,再加上方法名即可!
到这里,其实那些神秘的AOP我们完成了,我们可以在P方法中写自己想要的逻辑了,这些逻辑会在A和B方法执行之前来执行
如果有地方调用A函数,便会变成P-->A,B函数也同理;看例子,我们不得先执行P函数中的see()函数看了这篇文章,又执行love()函数爱上这篇文章,然后是A和B,是不是就是该关注这个公众号了呢?
疯狂暗示(PS:你这哪是暗示啊,你这都明示了,明的裤衩子都没了)
我们在上面说过有前置通知、后置通知、返回通知、异常通知、环绕通知这几种类型,每一种按照自己的需求来调整即可,我们上面举的例子是前置通知,我们也可以在执行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之后就可以点赞、转发和投喂了~
至于其余几个通知,也是同样的道理,值得一提的是环绕通知@Around,这个是可以把目标函数环绕起来执行,既可以等于前置和后置的结合,但是需要我们手动指定目标函数的执行位置,用joinPoint.procced()即可完成,代表目标函数执行,也可以根据函数要求传入相应的参数
总之,这个东西用起来很简单,但是内部原理才是最应该理解的,最应该关注的,你去找工作,面试官如果问你会不会AOP,你如果只给他扔个例子,他问你原理,你不会,那你完了,告诉你,十成八成凉凉,这基础的原理都不晓得,后续都不用问了,不太理解AOP的静态代理和动态代理的移步我的另一篇即可
其实我在之前的你读完这一篇还不会学Java过来打我!这一篇中也说过关于Spring应该如何准备的,可以读读撒
后置通知
你的八天国庆小假期即将到账,请注意签收
你知道的越多,你不知道的越多,下期见!