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 List 接口
Jul 07 Java/Android
关于springboot 配置date字段返回时间戳的问题
Jul 25 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
详解Java七大阻塞队列之SynchronousQueue
Sep 04 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
SpringBoot中HttpSessionListener的简单使用方式
Mar 17 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Spring 使用注解开发
May 20 Java/Android
利用正则表达式匹配浮点型数据
May 30 Java/Android
java中如何截取字符串最后一位
Jul 07 Java/Android
基于Android10渲染Surface的创建过程
Aug 14 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动态生成虚拟现实VRML网页
2006/10/09 PHP
php实现网站留言板功能
2015/11/04 PHP
php远程下载类分享
2016/04/13 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
js中判断控件是否存在
2010/08/25 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
Python中的魔法方法深入理解
2014/07/09 Python
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
急诊科护士自我鉴定
2013/10/14 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
《梅花魂》教学反思
2014/04/30 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
优秀校长事迹材料
2014/12/24 职场文书
2015个人半年总结范文
2015/03/09 职场文书
初婚未育证明样本
2015/06/18 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python