Spring this调用当前类方法无法拦截的示例代码


Posted in Java/Android onMarch 20, 2022

先给出代码示例

package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class ProxyService {
    public void  testA(){
        System.out.println("进入A");
        this.testB();
    }
    public void testB() {
        System.out.println("进入b");
    }

}
package com.example.demo.annotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class AspectjTest {
    @Around("execution(* com.example.demo.service.ProxyService.testB())")
    public void recordProxy(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        joinPoint.proceed();
        long end = System.currentTimeMillis();
        System.out.println("花费时间:"+(end-start));
    }
}
package com.example.demo.api;
import com.example.demo.service.ProxyService;
import com.example.demo.service.UserService;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ProxyApi {
//    @Autowired
//    ProxyService proxyService1;
    @Autowired
    private ApplicationContext applicationContext;
    @PostMapping("/proxy")
    public String test1() {
        ProxyService proxyService1 =  applicationContext.getBean(ProxyService.class);;
        proxyService1.testA();
        return "string";
    }
}

运行上面的代码会发现 配置aop 拦截方法不会被执行

Spring this调用当前类方法无法拦截的示例代码

我们通过debug 查看这个proxyService1 和this的区别,看看他们的值是什么

Spring this调用当前类方法无法拦截的示例代码

Spring this调用当前类方法无法拦截的示例代码

发现不一样,其实这就是问题的原因。

1、当我们在aop配置拦截的时候会指定类下面的方法路径,在spring启动的时候会先去加载这个ProxyService类,生成一个bean,但是因为你用aop配置了,所以需要代理这个ProxyService类,所以最终存在spring容器中的bean对象就是被代理后的bean对象。所以,我们在用容器获取bean或者用依赖注入获取bean的地址路径显示的是被代理后的bean 。
2、this获取的当前对象方法的一个引用,所以在调用testB方法的时候用的不是被代理的对象,自热不会经过aop拦截,原理和我们使用普通动态代理一样,只能是代理对象才能走自定义的方法。
3、可以通过debug 查看当ProxyService类被代理前和后的zhi值

Spring this调用当前类方法无法拦截的示例代码

Spring this调用当前类方法无法拦截的示例代码

发现是和之前的debug截图里面的值相符合的哈。

解决方法,就是在调用testB方法的时候用spring容器里的bean对象

@Service
public class ProxyService {
    @Autowired
    private  ProxyService proxyService;
    
    public void  testA(){
        System.out.println("进入A");
        proxyService.testB();
    }
    public void testB() {
        System.out.println("进入b");
}

或者

@Service
public class ProxyService {
    public void  testA(){
        System.out.println("进入A");
        ProxyService currentProxy = (ProxyService) AopContext.currentProxy();
        currentProxy.testB();
    }
    public void testB() {
        System.out.println("进入b");
    }
}

最终结果正确

Spring this调用当前类方法无法拦截的示例代码

到此这篇关于Spring this调用当前类方法无法拦截的文章就介绍到这了,更多相关Spring this无法拦截内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
Java 将PPT幻灯片转为HTML文件的实现思路
Jun 11 Java/Android
解决SpringBoot跨域的三种方式
Jun 26 Java/Android
Java集成swagger文档组件
Jun 28 Java/Android
springboot临时文件存储目录配置方式
Jul 01 Java/Android
新手初学Java网络编程
Jul 07 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
springboot用户数据修改的详细实现
Apr 06 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 Java/Android
Spring Data JPA框架Repository自定义实现
Apr 28 Java/Android
Java 定时任务技术趋势简介
May 04 Java/Android
Qt数据库应用之实现图片转pdf
Jun 01 Java/Android
Mybatis 一级缓存和二级缓存原理区别
Sep 23 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 #Java/Android
JavaWeb实现显示mysql数据库数据
关于Mybatis中SQL节点的深入解析
springboot 自定义配置 解决Boolean属性不生效
Mar 18 #Java/Android
使用Java去实现超市会员管理系统
Mar 18 #Java/Android
详解Spring Security中的HttpBasic登录验证模式
RestTemplate如何通过HTTP Basic Auth认证示例说明
You might like
php使用qr生成二维码的示例分享
2014/01/20 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
python文件操作整理汇总
2014/10/21 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python 从相对路径下import的方法
2018/12/04 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Python检测数据类型的方法总结
2019/05/20 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
HTML5实现签到 功能
2018/10/09 HTML / CSS
中学生学雷锋活动心得体会
2014/03/10 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
医德考评自我评价
2014/09/14 职场文书
抗洪救灾标语
2014/10/08 职场文书
用电申请报告范文
2015/05/18 职场文书
离婚答辩状范文
2015/05/22 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
运动会宣传稿50字
2015/07/23 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript
Python绘制散乱的点构成的图的方法
2022/04/21 Python
JS高级程序设计之class继承重点详解
2022/07/07 Javascript