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 相关文章推荐
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
Jun 26 Java/Android
SpringBoot快速入门详解
Jul 21 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
Java8中Stream的一些神操作
Nov 02 Java/Android
Java设计模式之享元模式示例详解
Mar 03 Java/Android
Java中的随机数Random
Mar 17 Java/Android
Spring 使用注解开发
May 20 Java/Android
Android实现图片九宫格
Jun 28 Java/Android
Java实现贪吃蛇游戏的示例代码
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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
华为c/c++笔试题
2016/01/25 面试题
品管员岗位职责
2013/11/10 职场文书
求职信写作要突出重点
2014/01/01 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
施工员岗位职责
2014/03/16 职场文书
大学生励志演讲稿
2014/04/25 职场文书
3的组成教学反思
2014/04/30 职场文书
班主任2015新年寄语
2014/12/08 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
Pytorch可视化的几种实现方法
2021/06/10 Python
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
实现GO语言对数组切片去重
2022/04/20 Golang