spring mvc AOP切面方法未执行的一种情况的分析和处理过程

 更新时间:2024年05月11日 10:25:35   作者:请叫我大师兄_  
这篇文章主要介绍了spring mvc AOP切面方法未执行的一种情况的分析和处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

spring mvc AOP 在service里面,嵌套调用一个触发切面方法,然而并没有触发切面方法执行,但在controller里面直接调用这个方法,就可以触发切面方法。

在springmvc里面,使用到AOP--面向切面编程,在切面做一些统一的事情。

遇到的情况是这样的

1:在controller里面直接调用service里面的save方法,那么就会触发切面的方法。

2:在controller里面调用service的其他方法,其他方法,最终会间接的调用这个save方法,这个时候,就不会触发切面方法。

dsx

大师兄

大师兄

首先,上面的切面表达式是没有问题的,肯定能切到对应的方法的。

这个切面,就是去统一刷新一下缓存,所以,只需要在涉及到修改数据库的时候,才需要执行这个切面的方法。

如果,没修改数据库的话,就不需要去刷新缓存。就这么一个需求。

解决方法

原来的间接调用save方法,是如下样式的。

因为这个save()方法就在同一个类里面所以,就可以直接调用,不嫌麻烦的,还可以在前面加个this。

这么使用的话,是不会触发切面方法执行的。

大师兄

修改如下:

在service类里面,使用resource注解,把自己再给引入一下,然后使用他去调用目标方法,触发切面方法。

大师兄

大师兄

在自己的类里面,再把自己给引入进来,在需要触发切面方法的时候,就是这个selfService.目标方法(),来触发切面去执行切面方法。

原理

看别人说这个使用ioc注入进来的这个service已经变成了一个代理啦,这个AOP的实现就是这个代理模式来实现的,你要是在类里面使用this来调用方法的话,就跟这个代理没关系啦,切面的触发,都是service的对应代理去触发的,所以,你在service里面直接调用触发切面的方法,是达不到这个效果的,所以,需要使用这个ioc注入的代理对象,就会触发切面的方法啦。

大师兄

看这个图的执行结果,可验证如下几个结论。

1,spring使用的aop是基于cglib来实现的。

2,交给IOC注入到容器的bean,我们使用的那个service是代理对象,不是原始对象。

注意

你这个不是在自己的类里面把自己又注入一次么。

所以,你在使用这个selfService的时候,小心点,避免陷入自己调用自己,然后,陷入无限循环的尴尬境地。

我想老铁不应该弄出这么简单的bug吧。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 取消idea双击shift键时出现的全局搜索的问题分析

    取消idea双击shift键时出现的全局搜索的问题分析

    这篇文章主要介绍了取消idea双击shift键时出现的全局搜索的问题分析,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • Spring WebMVC初始化Controller流程详解

    Spring WebMVC初始化Controller流程详解

    这篇文章主要介绍了Spring WebMVC初始化Controller流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java基础之Stream流原理与用法详解

    Java基础之Stream流原理与用法详解

    从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式。本文就来为大家详细讲讲Stream流原理与用法
    2022-08-08
  • springboot解决使用localhost或127.0.01模拟CORS失效

    springboot解决使用localhost或127.0.01模拟CORS失效

    CORS允许不同源的网页请求访问另一个源服务器上的某些资源,本文主要介绍了springboot解决使用localhost或127.0.01模拟CORS失效,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 使用easyexcel导出的excel文件,使用poi读取时异常处理方案

    使用easyexcel导出的excel文件,使用poi读取时异常处理方案

    这篇文章主要介绍了使用easyexcel导出的excel文件,使用poi读取时异常处理方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • YGC前后新生代是否变大分析详解

    YGC前后新生代是否变大分析详解

    要解释这个问题,我们先要弄清楚YGC的过程,parNew是新生代的gc算法,简单来说从gc roots开始扫描对象,当扫到一个只要是属于新生代的对象就将其挪到to space,但是老的对象还不会做释放,直到gc完成之后再看是否释放老的对象
    2022-01-01
  • mybatis实现获取入参是List和Map的取值

    mybatis实现获取入参是List和Map的取值

    这篇文章主要介绍了mybatis实现获取入参是List和Map的取值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • springboot中使用自定义两级缓存的方法

    springboot中使用自定义两级缓存的方法

    这篇文章主要介绍了springboot中使用自定义两级缓存的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java分析讲解序列化与字典功能的序列化

    Java分析讲解序列化与字典功能的序列化

    在项目开发地过程中经常会用到字典存储某些可配置的值,但相应的也会给开发带来复杂度,比如数据库存储的值为字典值:0,1,2,3这种类型的值,但是前端页面却需要展示为 启动、禁用、删除 等中文状态,下面我们来看两种解决方案
    2022-06-06
  • SpringBoot使用Quartz无法注入Bean的问题及解决

    SpringBoot使用Quartz无法注入Bean的问题及解决

    这篇文章主要介绍了SpringBoot使用Quartz无法注入Bean的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论