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 Shutdown Hook场景使用及源码分析
Jun 15 Java/Android
浅析NIO系列之TCP
Jun 15 Java/Android
Java用自带的Image IO给图片添加水印
Jun 15 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
Java 在生活中的 10 大应用
Nov 02 Java/Android
关于ObjectUtils.isEmpty() 和 null 的区别
Feb 28 Java/Android
Java生成日期时间存入Mysql数据库的实现方法
Mar 03 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
Mar 22 Java/Android
Android Flutter实现图片滑动切换效果
Apr 07 Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 14 Java/Android
JAVA springCloud项目搭建流程
May 11 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 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
preg_match_all使用心得分享
2014/01/31 PHP
php实现购物车功能(上)
2020/07/23 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
Python高级特性 切片 迭代解析
2019/08/23 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
8种常用的Python工具
2020/08/05 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
记帐员岗位责任制
2014/02/08 职场文书
十八大演讲稿
2014/05/22 职场文书
暑假学习心得体会
2014/09/02 职场文书
防灾减灾标语
2014/10/07 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
行政介绍信范文
2015/05/04 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL