spring mvc AOP切面方法未执行的一种情况的分析和处理过程
spring mvc AOP 在service里面,嵌套调用一个触发切面方法,然而并没有触发切面方法执行,但在controller里面直接调用这个方法,就可以触发切面方法。
在springmvc里面,使用到AOP--面向切面编程,在切面做一些统一的事情。
遇到的情况是这样的
1:在controller里面直接调用service里面的save方法,那么就会触发切面的方法。
2:在controller里面调用service的其他方法,其他方法,最终会间接的调用这个save方法,这个时候,就不会触发切面方法。



首先,上面的切面表达式是没有问题的,肯定能切到对应的方法的。
这个切面,就是去统一刷新一下缓存,所以,只需要在涉及到修改数据库的时候,才需要执行这个切面的方法。
如果,没修改数据库的话,就不需要去刷新缓存。就这么一个需求。
解决方法
原来的间接调用save方法,是如下样式的。
因为这个save()方法就在同一个类里面所以,就可以直接调用,不嫌麻烦的,还可以在前面加个this。
这么使用的话,是不会触发切面方法执行的。
![]()
修改如下:
在service类里面,使用resource注解,把自己再给引入一下,然后使用他去调用目标方法,触发切面方法。

![]()
在自己的类里面,再把自己给引入进来,在需要触发切面方法的时候,就是这个selfService.目标方法(),来触发切面去执行切面方法。
原理
看别人说这个使用ioc注入进来的这个service已经变成了一个代理啦,这个AOP的实现就是这个代理模式来实现的,你要是在类里面使用this来调用方法的话,就跟这个代理没关系啦,切面的触发,都是service的对应代理去触发的,所以,你在service里面直接调用触发切面的方法,是达不到这个效果的,所以,需要使用这个ioc注入的代理对象,就会触发切面的方法啦。

看这个图的执行结果,可验证如下几个结论。
1,spring使用的aop是基于cglib来实现的。
2,交给IOC注入到容器的bean,我们使用的那个service是代理对象,不是原始对象。
注意
你这个不是在自己的类里面把自己又注入一次么。
所以,你在使用这个selfService的时候,小心点,避免陷入自己调用自己,然后,陷入无限循环的尴尬境地。
我想老铁不应该弄出这么简单的bug吧。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
自定义注解实现Spring容器注入Bean方式(类似于mybatis的@MapperScans)
本文介绍了如何通过自定义注解@MyService和@MyServiceScans在SpringBoot项目中自动将指定包下的类注入Spring容器,详细解释了创建自定义注解、定义包扫描器ClassPathBeanDefinitionScanner的作用与实现2024-09-09
Java Stream map, Collectors(toMap, toLis
这篇文章主要介绍了Java Stream map, Collectors(toMap, toList, toSet, groupingBy, collectingAndThen)使用案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-09-09
Java语言实现简单FTP软件 FTP软件远程窗口实现(6)
这篇文章主要为大家详细介绍了Java语言实现简单FTP软件,FTP软件远程窗口的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-03-03
springboot使用ThreadPoolTaskExecutor多线程批量插入百万级数据的实现方法
这篇文章主要介绍了springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-02-02


最新评论