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 相关文章推荐
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
java中重写父类方法加不加@Override详解
Jun 21 Java/Android
springboot如何初始化执行sql语句
Jun 22 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
dubbo集成zipkin获取Traceid的实现
Jul 26 Java/Android
Spring Boot 底层原理基础深度解析
Apr 03 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
Apr 13 Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 Java/Android
利用正则表达式匹配浮点型数据
May 30 Java/Android
解决spring.thymeleaf.cache=false不起作用的问题
Jun 10 Java/Android
SpringBoot深入分析讲解监听器模式下
Jul 15 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的图形函数中显示汉字
2006/10/09 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
python with statement 进行文件操作指南
2014/08/22 Python
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
python定时关机小脚本
2018/06/20 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
简单的命令查看安装的python版本号
2020/08/28 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
银行自荐信范文
2013/10/07 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
浅谈如何提高PHP代码的质量
2021/05/28 PHP