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利用redis、Redisson处理并发问题的操作
Jun 18 Java/Android
启动Tomcat时出现大量乱码的解决方法
Jun 21 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
Mybatis-plus在项目中的简单应用
Jul 01 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
使用Java去实现超市会员管理系统
Mar 18 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
Java实现添加条码或二维码到Word文档
Jun 01 Java/Android
SpringBoot项目部署到阿里云服务器的实现步骤
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
PHP URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
php获取淘宝分类id示例
2014/01/16 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
python fabric实现远程操作和部署示例
2014/03/25 Python
python写一个md5解密器示例
2018/02/23 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
python中Mako库实例用法
2020/12/31 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
珍爱生命演讲稿
2014/05/10 职场文书
个人贷款收入证明
2014/10/26 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
六五普法心得体会2016
2016/01/21 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
Redis安装使用RedisJSON模块的方法
2022/03/23 Redis