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常用工具类汇总 附示例代码
Jun 26 Java/Android
分析Java中Map的遍历性能问题
Jun 26 Java/Android
深入理解java.lang.String类的不可变性
Jun 27 Java/Android
浅谈sql_@SelectProvider及使用注意说明
Aug 04 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
使用Spring处理x-www-form-urlencoded方式
Nov 02 Java/Android
深入浅出讲解Java8函数式编程
Jan 18 Java/Android
Java 数据结构七大排序使用分析
Apr 02 Java/Android
Android Gradle 插件自定义Plugin实现注意事项
Jun 16 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
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实现PDO的mysql数据库操作类
2014/12/12 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
使用python实现滑动验证码功能
2019/08/05 Python
python tkinter控件布局项目实例
2019/11/04 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
django rest framework 自定义返回方式
2020/07/12 Python
详解python datetime模块
2020/08/17 Python
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
美国知名生活购物网站:Goop
2017/11/03 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
中职应届生会计求职信
2013/10/23 职场文书
办公室内勤工作职责
2013/12/11 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
新店开张宣传语
2015/07/13 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
分析Netty直接内存原理及应用
2021/06/14 Java/Android