系列三十五、Spring AOP失效原因以及解决方式

news2024/11/17 15:44:36

一、Spring AOP失效原因

(1)内部调用不会触发AOP;

(2)方法是private修饰的,AOP会失效;               解决方法:改成public

(3)目标类没有配置为bean,AOP会失效;           解决方法:将目标类配置为bean

(4)切入点表达式配置不正确,AOP也会失效;     解决方法:正确配置切入点

二、Spring  AOP正常代理案例

2.1、pom

<dependencies>
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>3.1</version>
    </dependency>
    <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.19</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.16</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
    </dependency>
    <!-- 普通maven项目中使用Sl4j注解 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.32</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.10</version>
    </dependency>

</dependencies>

2.2、MySpringConfig

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 16:30
 * @Description: 演示Spring AOP(正常情况)
 * @EnableAspectJAutoProxy的作用:开启Spring对AOP的支持
 *      属性:boolean proxyTargetClass() default false;
 *          作用:是否启用CGLIB动态代理:
 *              true:启用
 *              false:不启用
 *          说明:如果不设置的话,Spring会自行选择,当被代理对象实现了接口将会使用JDK动态代理,否则使用CHLIB动态代理
 *      属性:boolean exposeProxy() default false;
 *          作用:是否暴露当前代理对象到本地线程
 *              true:暴露
 *              false:不暴露
 */
@Configuration
@ComponentScan(basePackages = "org.star")
@EnableAspectJAutoProxy
public class MySpringConfig {
    
}

2.3、Calculator

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 15:18
 * @Description: 计算器类
 */
public interface Calculator {
    /**
     * 加
     * @param num1
     * @param num2
     * @return
     */
    int add(Integer num1,Integer num2);

    /**
     * 减
     * @param num1
     * @param num2
     * @return
     */
    int subtract(Integer num1,Integer num2);

    /**
     * 乘
     * @param num1
     * @param num2
     * @return
     */
    int multiply(Integer num1,Integer num2);

    /**
     * 除
     * @param num1
     * @param num2
     * @return
     */
    int divide(Integer num1,Integer num2);

}

2.4、CalculatorImpl

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 15:20
 * @Description: 目标类
 */
@Component
@Slf4j
public class CalculatorImpl implements Calculator {

    @Override
    public int add(Integer num1, Integer num2) {
        log.info("执行目标方法add,参数:{},{}", num1, num2);

        return num1 + num2;
    }

    @Override
    public int subtract(Integer num1, Integer num2) {
        log.info("执行目标方法subtract,参数:{},{}", num1, num2);

        return num1 - num2;
    }

    @Override
    public int multiply(Integer num1, Integer num2) {
        log.info("执行目标方法multiply,参数:{},{}", num1, num2);

        return num1 * num2;
    }

    @Override
    public int divide(Integer num1, Integer num2) {
        log.info("执行目标方法divide,参数:{},{}", num1, num2);

        return num1 / num2;
    }
}

2.5、测试

@Slf4j
public class App {

    public static void main(String[] args) {
        m1();
    }

    /**
     * jdk动态代理案例一
     */
    private static void m1() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);
        Calculator calculator = context.getBean(Calculator.class);
        int result = calculator.add(3, 2);
        System.out.println(result);
    }

}

三、Spring  AOP内部调用导致AOP失效&解决方案(一)

3.1、失效

失效代码基本同上,修改的地方为 CalculatorImpl#add()

@Override
public int add(Integer num1, Integer num2) {
    log.info("执行目标方法add,参数:{},{}", num1, num2);
    /**
     * 演示Spring AOP内部调用导致AOP失效
     *  int subtractResult = subtract(num1, num2);
     *  System.out.println("subtractResult = " + subtractResult);
     */
    int subtractResult = subtract(num1, num2);
    System.out.println("subtractResult = " + subtractResult);
    return num1 + num2;
}

3.1.1、测试

3.2、解决 

解决也很简单,代码基本同上,修改内容如下

 

3.2.1、测试

四、Spring  AOP内部调用导致AOP失效&解决方案(二) 

4.1、解决

代码基本同2.xxx、修改内容如下:

4.1.1、MySpringConfig

 

4.1.2、CalculatorImpl

 4.1.3、测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【P2P owt】owt-client-native-p2p-e2e-test vs2017构建7:依赖库及路径

依赖库 G:\CDN\LiveServiceMesh\cdnsignal\third_party\libeva\thirdparty\janbar-openssl\out32\ssl\Debug\libssl-

vue面试题-原理层

虚拟dom 虚拟dom是什么?虚拟dom在vue中做了什么? vue 渲染两条线 虚拟dom是如何提升vue的渲染效率的? 局部更新节点数据将直接操作dom的地方拿到两个js对象之中去做比较 虚拟dom生成三要素 节点类型/目标元素 [必须有]节点属性子节点 Diff中的patch 虚拟dom 虚拟dom是什么…

编写Groovy Hello World 程序

使用 IntelliJ IDEA 打开 IntelliJ IDEA&#xff0c;并创建一个新的 Groovy 项目。 在项目中创建一个新的 Groovy 类文件&#xff0c;命名为 HelloWorld.groovy。 在 HelloWorld.groovy 文件中&#xff0c;编写以下代码&#xff1a; class HelloWorld {static void main(Stri…

初识Java 16-3 字符串

目录 扫描输入&#xff08;Scanner&#xff09; Scanner的分隔符 使用正则表达式扫描 StringTokenizer 本笔记参考自&#xff1a; 《On Java 中文版》 扫描输入&#xff08;Scanner&#xff09; 先看看在Scanner类加入之前&#xff0c;Java是如何处理文件或标准输入的&…

国际物流常见风险如何规避_箱讯科技

外贸物流是国际贸易的重要环节&#xff0c;其管理和效率的高低直接影响着贸易的成本和效益。因此&#xff0c;外贸企业应该重视物流的组织和管理&#xff0c;提高物流运作的效率。 国际物流基础知识 01什么是“双清包税”和“双清不包税” 双清包税上门又叫双清包税到门&…

接口测试学习手册

很多人会谈论接口测试。到底什么是接口测试&#xff1f;如何进行接口测试&#xff1f;这篇文章会帮到你。 前端和后端 在谈论接口测试之前&#xff0c;让我们先明确前端和后端这两个概念。 前端是我们在网页或移动应用程序中看到的页面&#xff0c;它由 HTML 和 CSS 编写而成…

天软特色因子看板(2023.10 第13期)

该因子看板跟踪天软特色因子A05005(近一月单笔流涌金额占比(%)&#xff0c;该因子为近一个月单笔流通金额占比因&#xff0c;用以刻画股票在收盘时&#xff0c;主力资金在总交易金额中所占的比重。 今日为该因子跟踪第11期&#xff0c;跟踪其在SW801150 (申万医药生物) 中的表现…

STM32-RTC实时时钟

RTC实时时钟 STM32的RTC外设&#xff0c;实质上是一个掉电后还继续运行的定时器。类似于通用定时器TIM外设&#xff0c;可以计时和触发中断。 掉电指的是电源VDD断开时为了RTC外设掉电继续运行&#xff0c;必须接上锂电池给STM32的RTC、备份发卡通过Vbat引脚供电。当主电源VDD有…

TensorBoard官方教程

如何在 PYTORCH 中使用 TENSORBOARD&#xff1a;https://pytorch.org/tutorials/recipes/recipes/tensorboard_with_pytorch.html 更详细一点的&#xff1a;https://pytorch.org/docs/stable/tensorboard.html 主要是 一个函数 writer.add_scalar()

JavaScript基础知识19——循环结构:while循环

哈喽&#xff0c;你好&#xff0c;我是雷工。 本节学习JavaScript基础语法的循环结构&#xff1a;while循环&#xff0c;以下为学习笔记。 while循环 循环概念&#xff1a;重复执行一些操作&#xff1b; 循环特征&#xff1a;不断地重复&#xff1b; while&#xff1a;在…期间…

echarts 力向导图_关系图_知识图谱

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、力向导图二、环形图…

VS Code开发Java之快速入门

VS Code 开发Java的环境 要在VS Code中开发Java应用程序&#xff0c;需要安装以下组件&#xff1a; Java Development Kit&#xff08;JDK&#xff09;&#xff1a;JDK是Java开发的基础&#xff0c;需要下载和安装JDK。Visual Studio Code&#xff1a;VS Code是一个免费的跨平…

Freertos tick 不响应中断的解决方法

代码环境 babyosfreertos 操作方法 通过 shell 操作eeprom 的写操作 问题现象 整个系统会卡在延时函数这里&#xff0c;卡的原因是rtos 的tick中断不响应了。 shell不响应外部命令 系统是正常运行的。 解决方法 成功的方法 ms延时由依赖tick改为us的堵塞延时&#xff1…

虚拟化的基础知识

目录 虚拟化基础 虚拟化的概念 虚拟化的特征&#xff08;本质&#xff09; 虚拟机的两大派别 VMM讲解 虚拟化中的一些重要概念 VMM的功能以及分类 虚拟化的架构 寄居虚拟化 裸金属虚拟化 操作系统虚拟化 混合虚拟化 虚拟化的三个方向 虚拟化基础 虚拟化的概念 什…

VMware打开centos黑屏解决方法汇总

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…

世界电信日 | 人大金仓助力中国移动租赁核算系统升级上线

世界电信日 5月17日恰逢第五十四个世界电信日&#xff0c;运营商作为新型基础设施建设以及维护网信安全的主力军&#xff0c;掌握关键核心技术&#xff0c;实现科技自立自强刻不容缓。 作为数据库领域国家队&#xff0c;人大金仓坚持原始创新&#xff0c;低难度、低成本、低风…

【广州华锐视点】节省成本,提升效果!教你快速搭建一个元宇宙3D虚拟展厅!

在当今这个数字化的时代&#xff0c;拥有一个专业的网站或者小程序已经成为了企业展示形象、推广产品的重要手段。然而&#xff0c;对于许多小企业来说&#xff0c;高昂的开发费用和复杂的技术门槛往往成为了他们实现这一目标的最大阻碍。那么&#xff0c;有没有一种方式&#…

两个字符串的最小ASCII删除和

题目描述 给定两个字符串s1 和 s2&#xff0c;返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。 示例 思路 这个题的解法一和最长公共子序列的解法大致相同&#xff0c;我们可以在此代码基础上稍微更改即可。 代码如下 解法一 public int minimumDeleteSum1(Stri…

【Spring】DI依赖注入,Lombok以及SpEL

文章目录 1.什么是DI依赖注入2. set方法注入3. ref属性4. 有参构造方法注入5. Lombok6. SpEL 1.什么是DI依赖注入 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;也是Spring框架的核心概念之一。其基本思想是将程序中的各…

基于和声算法的无人机航迹规划-附代码

基于和声算法的无人机航迹规划 文章目录 基于和声算法的无人机航迹规划1.和声搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用和声算法来优化无人机航迹规划。 1.和声搜索算法 …