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中Collection的一些常用方法总结
Jun 13 Java/Android
SpringBoot2 参数管理实践之入参出参与校验的方式
Jun 16 Java/Android
springboot集成flyway自动创表的详细配置
Jun 26 Java/Android
HashMap实现保存两个key相同的数据
Jun 30 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
SpringMVC 整合SSM框架详解
Aug 30 Java/Android
springboot layui hutool Excel导入的实现
Mar 31 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
Java 多态分析
Apr 26 Java/Android
Android 界面一键变灰 深色主题工具类
Apr 28 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
MyBatis XPathParser解析器使用范例详解
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 批量替换程序的具体实现代码
2013/10/04 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
js资料prototype 属性
2007/03/13 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
js简易版购物车功能
2017/06/17 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
自己动手封装一个React Native多级联动
2018/09/19 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
python RSA加密的示例
2020/12/09 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
python中xlrd模块的使用详解
2021/02/01 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
承诺书范文
2014/06/03 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年科研工作总结
2014/12/03 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书