spring Aop嵌套调用的解决办法

2023-11-09

众所周知,Spring AOP在同一个类里自身方法相互调用时是无法拦截的。

问题示例代码

    public String say(String a) {
        System.out.println("say a=" + a);
        say2(a);
        return a + a;
    }

    public String say2(String a) {
        System.out.println("say2 a=" + a);
        return a + a;
    }

两个方法经过AOP代理,执行时都实现系统日志记录。单独使用say2时,没有任何问题。但say就有问题了。say里调用的say2方法是原始的,未经过AOP增强的。

spring Aop嵌套调用的解决办法

方法1,将自身注入到自身
示例代码

package com.subject.spring;

import org.springframework.aop.framework.AopContext;
import org.springframework.aop.framework.AopProxy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class OneBean {
    @Resource
    private OneBean oneBean;

    public OneBean() {
        System.out.println("构造器OneBean加载..." + this);
    }

    public String say(String a) {
        System.out.println("say a=" + a);
        //say2(a);
        oneBean.say2(a);
//        ((OneBean)AopContext.currentProxy()).say2(a) ;
        return a + a;
    }

    public String say2(String a) {
        System.out.println("say2 a=" + a);
        return a + a;
    }
}

方法2,使用AopContext.currentProxy())来操作

package com.subject.spring;

import org.springframework.aop.framework.AopContext;
import org.springframework.aop.framework.AopProxy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class OneBean {


    public OneBean() {
        System.out.println("构造器OneBean加载..." + this);
    }

    public String say(String a) {
        System.out.println("say a=" + a);
        //say2(a);
        ((OneBean)AopContext.currentProxy()).say2(a) ;
        return a + a;
    }

    public String say2(String a) {
        System.out.println("say2 a=" + a);
        return a + a;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring Aop嵌套调用的解决办法 的相关文章

  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • Spring 3 匹配通配符严格,但找不到元素 'jee:jndi-lookup' 的声明

    所以我遇到了与这里类似的问题 Spring 3 0错误 匹配通配符严格 但找不到元素的声明 https stackoverflow com questions 8651781 spring 3 0 error the matching wi
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • Unity【LayerMask】层级关系以及代码对层级的控制

    LayerMask的存储 LayerMask的每一个层级都是一个二进制数字 实际上LayerMash是32位的二进制记录的 每一个层级对应一个二进制位置 所以理论上Unity最多能有32个层级关系 为了方便解释以下列表假设只有5位二进制数据
  • Qt:FTP 与 QFtp 实现文件传输(C++: ftplib)

    目录 C 与 FTP 1 1 简介 1 2 工作原理 1 2 1 独特优势 1 2 2 基本模型 1 3 用户与传输 1 3 1 用户分类 1 3 2 传输方式 1 3 3 传输模式 1 4 控制命令 实现方式 2 1 QFtp 2 2 Q
  • eml文件是什么格式的文件?怎么打开?怎么导出eml文件?

    eml格式文件是一个电子邮件文件 其格式名由来是E mail 电子邮件 的缩写形式 一个eml文件打开后就是一封电子邮件 E mail 它是电子邮件导出后的格式 163 QQ等使用较多的邮件服务商都有邮件导出功能 导出后的文件就是eml格式
  • cmake的add_subdirectory

    命令格式 add subdirectory source dir binary dir EXCLUDE FROM ALL 添加一个子目录并构建该子目录 如果想同时编译多个CmakeLists txt 可以使用add subdirectory
  • cmakelist的作用及使用

    cmakelist的作用及使用 cpp平常的运行方式 cpp为编译型语言 需要把cpp文件编译成可执行文件 然后执行可执行文件 gcc main cpp o main 执行该可执行文件 main 但由于一些依赖错综复杂 且需要大量指令依次执
  • INS/GNSS组合导航(七)-SINS的微分方程的推导

    三 中对SINS的机械编排进行了初步可行性的介绍 并未对机械编排进行原理性介绍 那么在详细介绍机械编排之前 需要先对SINS的微分方程进行详细的推导 无论是机械编排 还是后面误差方程的建立 SINS的微分方程都是其重要的基础内容 那么本文在
  • 原神--原学入门--元素结晶盾盾值计算

    由于在角色的元素精通面板是可以看到分为了四类加成 其中一项便是对于结晶反应得到的元素护盾的增幅 于是便开始着手学习相关的计算 便览众多说法 最终都是归一为了如同文章 数据讨论 结晶反应护盾值计算相关 NGA玩家社区 的说法一样的计算方法 1
  • 2020年第十一届蓝桥杯javaB组省赛

    文章目录 试题 A 门牌制作 试题 B 寻找 2020 试题 C 蛇形填数 试题 D 七段码 试题 E 排序 试题 F 成绩分析 试题 G 单词分析 试题 H 数字三角形 试题 I 子串分值和 试题 J 装饰珠 以下均为个人想法和解题思路
  • c/c++ 智能指针 weak_ptr 使用

    智能指针 weak ptr 使用 weak ptr用途 1 解决空悬指针问题 2 解决循环引用问题 weak ptr特点 没有 操作和 gt 操作 weak ptr是不控制所指对象生存周期的智能指针 它指向由一个shared ptr管理的对
  • java版 SpringCloud 之目前得前端框架都有哪些?

    1 AngularJS Angular JS 是一个有Google维护的开源前端web应用程序框架 它最初由Brat Tech LLC的Misko Hevery于2009年开发出来 Angular JS是一个模型 视图 控制器 MVC 模式
  • libdl.so的用途

    通过对某些bin或者so执行ldd 可以看到他们运行前需要连接的共享库 但是有时候会看到有2个与dl相关的so ld linux so和libdl so 这时候我就有些困惑了 他们分别做了什么工作呢 原来 ld linux so的工作是在程
  • monkeyrunner的基本

    导入我们需要用到的包和类并且起别名 import sys from com android monkeyrunner import MonkeyRunner as mr from com android monkeyrunner impor
  • 渗透测试工程师面试题大全(三)

    渗透测试工程师面试题大全 三 from backlion大佬 整理 101 什么是 WebShell WebShell 就是以 asp php jsp 或者 cgi 等网页文件形式存在的 种命令执行环境 也可以将其称做为 种网页后门 黑客在
  • VLAN间路由及路由器下连接交换机的配置方法

    方法一 建议路由器下连接三层交换机 例如Cisco3650 大体思路是 三层交换机与路由器之间建立OSPF邻居 将交换机上的Vlan三层网段宣告出来 Vlan中主机的默认网关设置为Vlan三层网段实现Vlan间互通以及对外通信 其中 Vla
  • 关于火星坐标系统

    转载 关于火星坐标系统 2011 09 08 23 11 57 分类 默认分类 字号 订阅 偶然得知中国有一种火星坐标系统 其原理是这样的 保密局开发了一个系统 能将实际的坐标转换成虚拟的坐标 所有在中国销售的数字地图必须使用这个系统进行坐
  • 显示Hello World

    C 语言 include iostream using namespace std int main cout lt lt Hello World lt
  • 没有编程基础,可以自学Python吗?

    可以 Python是一门简单优雅的计算机程序设计语言 自身的特点决定了它是一门易学难精的语言 所以对于零基础学员而言 只要肯努力 学习是没有问题的 下面说说相比于C语言 Java语言 Python的特点 Python语法简单 代码可读性高
  • 性能监控-influxDB+grafana+jmeter展示测试结果

    InfluxDB 是 Go 语言编写的时间序列数据库 用于处理海量写入与负载查询 涉及大量时间戳数据的任何用例 包括 DevOps 监控 应用程序指标等 我认为 InfluxDB 最大的特点在于可以按照时间序列面对海量数据时候的高性能读写能
  • 高数【求导】--猴博士爱讲课

    第三课 求导 1 5 照公式求导 常见的求导 2 5 隐函数求导 例 1 若 y y
  • spring Aop嵌套调用的解决办法

    众所周知 Spring AOP在同一个类里自身方法相互调用时是无法拦截的 问题示例代码 public String say String a System out println say a a say2 a return a a publ