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基于字符界面的简易收银台
Jun 26 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
Jun 27 Java/Android
Java实现多文件上传功能
Jun 30 Java/Android
mybatis 解决从列名到属性名的自动映射失败问题
Jun 30 Java/Android
dubbo集成zipkin获取Traceid的实现
Jul 26 Java/Android
在Spring-Boot中如何使用@Value注解注入集合类
Aug 02 Java/Android
springboot+zookeeper实现分布式锁
Mar 21 Java/Android
关于EntityWrapper的in用法
Mar 22 Java/Android
java项目构建Gradle的使用教程
Mar 24 Java/Android
Spring Boot 底层原理基础深度解析
Apr 03 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
java实现面板之间切换功能
Jun 10 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 日期时间处理函数小结
2009/12/18 PHP
解析php中反射的应用
2013/06/18 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
详解JavaScript树结构
2017/01/09 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
Python代理抓取并验证使用多线程实现
2013/05/03 Python
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
大一军训感言
2014/01/09 职场文书
农村婚礼主持词
2014/03/13 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
故意伤害辩护词
2015/05/21 职场文书
党员转正党支部意见
2015/06/02 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python