AOP切面Around通知测试

2023-11-04

1.无异常情况

  • 配置类
package concert;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * AspectJ自动代理会为使用@Aspect注解的bean创建一个代理,这个代理会围绕着所有该切面的切点所匹配的的bean
 */
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class ConcertConfig {
    @Bean
    public Audience audience() {
        return new Audience();
    }
}

  • 目标接口和实现类
package concert;

public interface Performance {
    public void perform();
}

package concert;

import org.springframework.stereotype.Component;

/**
 * 目标类
 */
@Component
public class PerformanceImpl implements Performance{
    @Override
    public void perform() {
        System.out.println("perform start");
    }
}

  • 切面类
package concert;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 切面类
 */
@Aspect
public class Audience {

    // 使用Pointcut声明频繁使用的切点
    @Pointcut("execution(* concert.Performance.perform(..))")
    public void performance(){}

    @Before("performance()")
    public void silenceCellPhones() {
        System.out.println("==========Before start=======");
        System.out.println("Silencing cell phones");
        System.out.println("==========Before end=======");
    }
    @Before("performance()")
    public void takeSeats() {
        System.out.println("==========Before start=======");
        System.out.println("Taking Seats");
        System.out.println("==========Before end=======");
    }
    @AfterReturning("performance()")
    public void applause() {
        System.out.println("==========AfterReturning start=======");
        System.out.println("CLAP CLAP CLAP!!");
        System.out.println("==========AfterReturning end=======");
    }
    @AfterThrowing("performance()")
    public void demandRefund() {
        System.out.println("==========AfterThrowing start=======");
        System.out.println("demanding a refund");
        System.out.println("==========AfterThrowing end=======");
    }

    @Around("performance()")
    public void watchPerformance(ProceedingJoinPoint joinPoint) {

        try {
            System.out.println("==========Around start=======");
            System.out.println("Around:Silencing cell phones");
            System.out.println("Around:Taking Seats");
            // 执行目标方法
            joinPoint.proceed();
            System.out.println("Around:CLAP CLAP CLAP!!");
            System.out.println("==========Around end=======");
        } catch (Throwable e) {
            System.out.println("Around:demanding a refund");
            System.out.println("==========Around end=======");
        }

    }
}
  • 测试类
package concert;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConcertConfig.class)
public class Test {

    @Autowired
    Performance performance;
    @org.junit.Test
    public void test() {
        performance.perform();
    }

}

  • 运行结果
==========Around start=======
AroundSilencing cell phones
AroundTaking Seats
==========Before start=======
Silencing cell phones
==========Before end=======
==========Before start=======
Taking Seats
==========Before end=======
perform start
==========AfterReturning start=======
CLAP CLAP CLAP!!
==========AfterReturning end=======
AroundCLAP CLAP CLAP!!
==========Around end=======

从运行结果可以看出,执行顺序为前Around->Before->目标方法->AfterReturning->后Around,也就是说Around方法如字面意思,环绕目标方法前后的通知方法。

2.有异常情况

  • 目标类
package concert;

import org.springframework.stereotype.Component;

/**
 * 目标类
 */
@Component
public class PerformanceImpl implements Performance{
    @Override
    public void perform() {
        System.out.println(1/0);
        System.out.println("perform start");
    }
}

  • 运行结果
==========Around start=======
AroundSilencing cell phones
AroundTaking Seats
==========Before start=======
Silencing cell phones
==========Before end=======
==========Before start=======
Taking Seats
==========Before end=======
==========AfterThrowing start=======
demanding a refund
==========AfterThrowing end=======
Around:demanding a refund
==========Around end=======

从运行结果可以看出,执行顺序为Around中目标前->Before->目标方法->AfterThrowing->Around中catch模块,因为出现异常目标后正常的语句没有执行,进入catch。

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

AOP切面Around通知测试 的相关文章

  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 将不同类型的参数传递给 jdbctemplate 查询

    我正在尝试使用带有少量不同类型参数的 where 子句从数据库中检索记录 这是我编写的简单方法 我将breedId和性别作为参数传递 public List
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • STM32 进阶教程 6 -  汇编与C混合编程

    前言 在嵌入式开发过程中 有时候为了追求代码性能与效率不得不采用汇编语言来编写代码 但是汇编代码在阅读时表现不如C语言友好 本节给大家介绍一种新的方法 关键代码用汇编语言时行实现 然后用C语言时行接封装 用C语言与汇编语言混合编程的方式 在
  • DELL T420塔式服务器RAID配置及OS安装

    一 DELL T420塔式服务器RAID配置 1 服务器RAID卡配置 开机看到CTRL R的提示后及时按下CTRL R进到阵列卡配置界面 进去之后光标默认就在阵列卡型号上 比如 PERC H310 PERC H710 PERC H710P
  • C++装饰者模式:Decorator Pattern

    设计原则 类应该对扩展开发 对修改关闭 装饰者可以在所委托被装饰者的行为之后加上自己的行为 以达到特定的目的 装饰者模式 动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 装饰者和被装饰者必须是一样的类型 也就是
  • 多目标跟踪算法之SORT

    本文首发于微信公众号 DeepDriving 欢迎关注 简介 SORT是2016年发表的一篇文章 Simple Online and Realtime Tracking 中提出的一个经典的多目标跟踪算法 该算法结合常用的卡尔曼滤波器和匈牙利
  • 服务器128g内存显示64g,64g内存服务器

    64g内存服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 接口名称GetCloudPhoneServerModel
  • httprunner 3.x学习1 - 环境安装与准备

    前言 httprunner 3 x最大的改变是执行用例用的是 python 的 pytest 框架 支持3种格式的用例 YAML JSON pytest 代码 对比 httprunner 2 x 以前版本 早期版本用的是 unittest
  • el-select 默认值显示value不显示label问题

    el select 默认值显示value不显示label问题 在做编辑页面时 需要取到列表项数据回显默认值 在做select回显的时候遇到了这个问题 明明拿到的值和value中的值一样 但是就是不转换成label 这种情况一般出现在valu
  • 清除苹果服务器位置,苹果桌面三大清理工具_服务器评测与技术-中关村在线

    值得庆幸的是 Mac App Store的有三个应用程序 可以帮助你整理桌面 保证你的桌面整洁干净 前两者都是免费的 在桌面上扫描文件和文件夹时 只要一个命令 就能按照你的原设置整理文件夹 第三虽然是付费但是功能强大 能够隐藏你的文件 即保
  • 测试框架pytest教程(2)-用例依赖库-pytest-dependency

    对于 pytest 的用例依赖管理 可以使用 pytest dependency 插件 该插件提供了更多的依赖管理功能 使你能够更灵活地定义和控制测试用例之间的依赖关系 Using pytest dependency pytest depe
  • 大数据面试题:MapReduce压缩方式

    面试题来源 大数据面试题 V4 0 大数据面试题V3 0 523道题 679页 46w字 可回答 1 Hadoop常见的压缩算法有哪些 问过的一些公司 网易云音乐 2022 11 阿里 2020 08 参考答案 1 MapReduce支持的
  • java-web eclipse内tomcat无法访问网页 Google浏览器可以

    java web eclipse内tomcat无法访问网页 Google浏览器可以 1 eclipse 安装的Tomcat服务无法访问问网页 浏览器不可以 只有从tomcat 安装目录下启动startup bat或tomcat9 0自带的t
  • ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR解决办法

    windows开发 调用 InternetQueryOption 函数失败 错误码 12178 ERROR WINHTTP AUTO PROXY SERVICE ERROR 解决方法 运行 services msc 服务 WinHTTP W
  • git merge合并分支,解决冲突

    1 git merge示意 git merge 用来做分支合并 将其他分支中的内容合并到当前分支中 比如分支结构如下 master C0 C1 C2 C4 C3 C5 issueFix 当前分支是master git checkout ma
  • android:configChanges属性总结

    http blog csdn net zhaokaiqiang1992 article details 19921703 android中的组件Activity在manifest xml文件中可以指定参数android ConfigChan
  • VSCode使用 - Remote-SSH 配置说明

    By Ailson Jack Date 2022 06 17 个人博客 http www only2fire com 本文在我博客的地址是 http www only2fire com archives 147 html 排版更好 便于学习
  • Kafka(生产者)

    Kafka 1 概述 1 1 消息队列 1 1 1 传统消息队列的应用场景 1 1 2 消息队列的两种模式 1 2 kafka基础结构 2 kafka的快速入门 2 1 集群部署 2 1 1 安装java 2 1 2 部署zookeeper
  • 第八课 SpringBoot2基础-指标监控

    第八课 SpringBoot2基础 指标监控 tags Spring Boot 2021尚硅谷 雷丰阳 文章目录 第八课 SpringBoot2基础 指标监控 第一节 SpringBoot Actuator简介 第二节 Actuator端点
  • 能不能把js文件放在服务器上,为什么要把 JavaScript 放到服务器端上运行?

    原标题 为什么要把 JavaScript 放到服务器端上运行 因为在当年 Node js的作者Ryan Dahl是一名资深的C C 程序员 在创造出Node之前 他的主要工作都是围绕高性能Web服务器进行的 经历过一些尝试和失败之后 他找到
  • wsl的图像化实现,在wsl中启动浏览器

    最近在学习wsl 原本我看以前的教程说wsl和vmware的区别有一点就是 wsl只能使用命令行 而vmware可以实现图像化 结果我在 microsoft 官方发现现在的wsl 2已经实现了 GUI 界面 所以就来记录一下吧 wsl 的
  • AOP切面Around通知测试

    1 无异常情况 配置类 package concert import org springframework context annotation Bean import org springframework context annota