IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring AOP之@Around@AfterReturning使用、切不进去问题解决 -> 正文阅读

[Java知识库]Spring AOP之@Around@AfterReturning使用、切不进去问题解决

前言

本文主要举几个工作中典型AOP的实操案例,还有经常出现的问题(切不进去,ctrl+左键跳不到被切方法中)等等。

本文对于AOP的实现原理概不讨论,百度一搜有的是。

AOP的使用背景和好处

比如A模块是公司的核心模块,这块代码未经允许不得轻易篡改。

但是你又有新的需求,需要在公司的核心模块的某个方法上进行增强(比如在执行核心方法的之前打印自定义日志,或者修改该核心方法的入参和返回值等等)

这样你就可以在不修改核心模块源码的情况下,对源代码的方法进行增强,扩展原来方法的一些功能。

这样既能保证源代码不被破坏,又可以扩展源代码现有的功能。

一、几种使用姿势

1、@AfterReturning和@Before

@AfterReturning是后置方法,在目标方法执行后执行,@Before是前置方法,在目标方法执行前执行

它们一般配合JoinPoint来使用(不能配合ProceedingJoinPoint,会报错)。直接看例子:

被切的方法:

@Service
public class OriFuncImpl implements OriFunc{

    @Override
    public String ori(String str){
        System.out.println("执行了原方法");
        return str;
    }
}

使用@AfterReturning 和 @Before:

@Aspect
@Component
public class AopFunc {
    @Pointcut("execution(* com.daji.aop_test.OriFuncImpl.ori(..))")
    public void test() {
    }

    @Before("test()")
    public void before(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();    //获取方法入参
        System.out.println("原方法的入参是:"+args[0]);
        System.out.println("原方法执行前会先执行我!!");
    }


    @AfterReturning("test()")
    public void after(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();    //获取方法入参
        System.out.println("原方法执行后会执行我!!");
    }

}

2、@Around

@Around是环绕通知,既可以控制入参,还可以控制原方法的执行和返回值

常常配合ProceedingJoinPoint来使用。直接看例子:

被切的方法:

@Service
public class OriFuncImpl implements OriFunc{

    @Override
    public String ori(String str){
        System.out.println("执行了原方法");
        return str;
    }
}

使用@Around:

@Aspect
@Component
public class AopFunc {
    @Pointcut("execution(* com.daji.aop_test.OriFuncImpl.ori(..))")
    public void modifyReturn() {
    }

    @Around("modifyReturn()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        Object result = joinPoint.proceed(args);
        return result;
    }

}

3、@Around可以篡改返回值,篡改入参

需要ProceedingJoinPoint的配合

注意一定要将@Around修饰的方法用Object修饰其返回值,并且返回原方法执行的结果,如下图所示:

在这里插入图片描述
篡改入参一样的道理,只需要篡改下图中的 args数组,然后让其传入proceed中,即可完成篡改入参。如下图所示:

在这里插入图片描述

所以,这个@Around比较万能,尤其是配合ProceedingJoinPoint的使用。使AOP能做的事情更多了。

引申一下JoinPoint 和 ProceedingJoinPoint的关系:

  • ProceedingJoinPoint 只能在@Around中使用

  • JoinPoint也可以获取入参(getArgs()),它可以用于@Before 和 @AfterReturning

  • Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法。它们之间的关系如下图:

在这里插入图片描述

4、@Around如果不执行proceed(),那么原方法将不会执行

二、使用AOP常见的问题和bug

1、切不进去

检查是否有如下注解:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.4</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.2</version>
</dependency>

检查完毕后检查切面类,看看有没有以下注解:

在这里插入图片描述

2、ctrl+鼠标左键不能自动跳到被切方法:

正常情况如图:

在这里插入图片描述
如果你存在上述问题,检查你有没有安装下列插件:

在这里插入图片描述
如果你是idea社区版,那么默认是没有的,你要么自己下,要么换成正式版。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:57:54  更:2022-03-03 15:59:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:26:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码