接着我们实现最原始的登录逻辑:
可以看到,我们的环绕增强针对login方法进行横切逻辑的织入,在调用目标对象的前后,分别对用户登录日志进行记录。
接下来写一个测试类看一下效果:
可以看到,我们通过AOP很方便地实现了日志记录功能。
AOP失效的情形
3
接下来假如我们又有了一个新需求,就是要对不合法用户做些特殊的处理,比如说统计下不合法用户调用登陆接口的次数。由于直接修改原有的登录逻辑有很多弊端,所以我们还是选择通过AOP来实现该功能。这可以通过编写一个返回增强来实现:
这个时候诡异的事情发生了。明明user_1为非法用户,但是为何没有对其登录次数进行累加呢P为何会失效呢将为你解开谜团。
AOP为何失效
4
之所以会出现上述AOP失效的现象,归根到底是由于AOP的实现机制导致的。Spring AOP采用代理的方式实现AOP,我们编写的横切逻辑被添加到动态生成的代理对象中,只要我们调用的是代理对象,则可以保证调用的是被增强的代理方法。而在代理对象中,不管你的横切逻辑是怎样的,也不管你增加了多少层的横切逻辑,有一点可以确定的是,你终归会调用目标对象的同一方法来调用原始的业务逻辑。
如果目标对象中的原始方法依赖于其他对象,那么Spring会注入所依赖对象的代理对象,从而保证依赖的对象的横切逻辑能够被正常织入。而一旦目标对象调用的是自身的其他方法时,问题就来了,这种情况下,目标对象调用的并不是代理对象的方法,故被调用的方法无法织入横切逻辑。
然后修改login方法,通过AopContext获取当前上下文代理对象,再通过该代理对象调用isLegal方法:
可以看到,现在已经可以实现对非法用户的登录次数进行累加了,这样就解决了上述AOP失效的问题。
往期推荐:
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览93643 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!