首页 > 其他分享 >Spring AOP当方法被内部调用时,增强逻辑失效问题原因及解决方案

Spring AOP当方法被内部调用时,增强逻辑失效问题原因及解决方案

时间:2024-07-17 18:51:29浏览次数:17  
标签:逻辑 调用 Spring AOP 失效 方法

首先,这个问题本质原因和我之前写的这篇文章《Spring事务调用类自己方法失效解决办法和原因》是一样的,都是动态代理失效导致的。

最近在开发中遇到了一个关于Spring AOP的问题。需求是统计某个方法的调用次数,我尝试使用Spring AOP来实现,但发现当方法被内部调用时,增强逻辑不生效。以下是详细描述和解决方案。

问题描述

我定义了一个接口ISon,包含方法A和方法B。在接口实现类Son中,方法B调用了方法A。同时,我通过AOP切面对方法A进行了增强。测试发现,当直接调用A时,增强逻辑正常工作;但当通过方法B调用A时,增强逻辑失效。

失效原因

原因在于,方法A被调用是基于AOP生成的代理对象进行的调用;而方法B调用方法A时,是直接通过this目标对象调用,并不是通过代理对象。

解决方案

为了解决这个问题,我需要确保即使是内部调用也能触发增强逻辑。一种方法是使用AopContext.currentProxy()来获取代理对象,并调用其方法。同时,需要在应用配置中开启AOP支持,并暴露代理对象。

  1. 开启AOP支持:在应用配置中添加以下注解:

    @EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)
    
  2. 修改方法调用:在方法B中,不直接调用A,而是通过代理对象调用:

    @Override
    public void B() {
        System.out.println("method B");
        ((Son) AopContext.currentProxy()).A();
    }
    
  3. 获取上下文的Bean再调用:另一种方法是通过应用上下文获取Bean,然后调用其方法:

    @Autowired
    private ApplicationContext applicationContext;
    
    ((Son) applicationContext.getBean(Son.class)).A();
    

通过这些修改,无论是直接调用还是内部调用,方法A的增强逻辑都能正常工作。这样,我就可以准确统计方法的调用次数了。

标签:逻辑,调用,Spring,AOP,失效,方法
From: https://www.cnblogs.com/shamo89/p/18308102

相关文章

  • SpringBoot学习笔记
    微服务阶段javaSE:OOPmySQL:持久化html+css+js+jquery+框架:视图,框架不熟练,css不好;javaweb:独立开发MVC三层架构的的网站:原始ssm:框架:简化了我们的开发流程,配置也开始较为复杂;war:tomcat运行spring再简化:springBoot-jar:内嵌tomcat;微服务架构!服务越来越多:springcloud!高内聚,低耦......
  • Spring5-基础(完整流程)
    1、Spring1.1、简介Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。Spring理念:使......
  • Spring Boot引入外部Jar
    springboot引入外部jar包并打包-乐子不痞-博客园(cnblogs.com)Jar存放位置 引入dependency<dependency><groupId>com.zebra.sdk</groupId><artifactId>com.zebra.sdk</artifactId><version>1.0.......
  • springboot自学(1)bean的加载方式
    第一个加载方式:Xml:声明和加载自定义的bean 声明第三方的bean遍历bean名称(id)如果不自定义id的话,会自动命名一个 Xml+注解:对xml文件进行修改  配置第三方的bean       纯注解:   FactoryBean    为什么会有这个......
  • 基于java+springboot+vue实现的实验室管理系统(文末源码+Lw)127
    基于SpringBoot+Vue的实现的实验室管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+演示视频+软件包)系统功能:实验室管理系统管理员功能有个人中心,学生管理,教师管理,公告信息管理,知识库管理,实验课程管理,实验室信息管理,实验室预约管理,实验设备管理,采购记录管理,维修记录管理......
  • 基于java+springboot+vue实现的汽车资讯网站(文末源码+Lw)125
    基于SpringBoot+Vue的实现的汽车资讯网站系统(源码+数据库+万字Lun文+流程图+ER图+结构图+演示视频+软件包)系统功能:汽车资讯网站有管理员和用户。管理员功能有个人中心,用户管理,汽车品牌管理,价格分类管理,经销商管理,汽车信息管理,留言板管理,系统管理等。用户可以查看各种汽车信......
  • 基于java+springboot+vue实现的中药实验管理系统(文末源码+Lw)124
    基于SpringBoot+Vue的实现的中药实验管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+开题报告+演示视频+软件包)系统功能:本中药实验管理系统有管理员,教师,学生,实验员。管理员功能有个人中心,学生管理,教师管理,实验员管理,实验教学管理,在线学习管理,实验信息管理,实验预约管理,实......
  • 基于java+springboot+vue实现的学生选课系统(文末源码+Lw)129
     系统角色:学生、教师、管理员系统功能:管理员管理专业,教师,学生,课程,查看学生选课以及学生成绩信息。教师查询学生,查询课程,审核学生选课信息,为学生学习的课程进行成绩打分学生参与课程选课,查询选课信息,查询已选课程的成绩信息。技术栈:开发语言:JavaJDK版本:JDK8前端......
  • 基于java+springboot+vue实现的中小企业人事管理系统(文末源码+Lw)128
     基于SpringBoot+Vue的实现的中小企业人事管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+ppt+演示视频+软件包)系统角色:员工、管理员系统功能:管理员登录进入中小企业人事管理系统可以查看首页、个人中心、员工管理、部门信息管理、职位信息管理、福利信息管理、培......
  • 基于java+springboot+vue实现的实验室管理系统(文末源码+Lw)127
     基于SpringBoot+Vue的实现的实验室管理系统(源码+数据库+万字Lun文+流程图+ER图+结构图+演示视频+软件包)系统功能:实验室管理系统管理员功能有个人中心,学生管理,教师管理,公告信息管理,知识库管理,实验课程管理,实验室信息管理,实验室预约管理,实验设备管理,采购记录管理,维修记录......