浅析Spring基于注解的AOP

浅析Spring基于注解的AOP

什么是AOP

AOP(Aspect Oriented Programming),面向切面编程,通过预编译方式和运行时动态代理实现在不修改原有业务代码的情况下,对系统功能进行增强。

在AOP中,切面是指一类横跨多个对象的特定行为,比如事务管理、日志管理等。切面可以包含前置、后置、环绕、异常通知等多个通知,对目标对象的方法进行增强。AOP不仅可以增强业务代码的复用性和灵活性,还可以对系统进行解耦,提高系统稳定性和可维护性。

Spring AOP注解

Spring框架提供了对AOP的支持,其中,基于注解的AOP使得AOP的实现更加简单易懂。

常用的Spring AOP注解有:

  • @Aspect:定义一个切面,当然切面也是一个类;
  • @Pointcut:定义切点,用于定义一组切入点,通常是一个方法;
  • @Before:定义前置通知,目标方法之前执行;
  • @AfterReturning:定义返回后通知,在目标方法返回结果之后执行;
  • @AfterThrowing:定义异常通知,在目标方法抛出异常之后执行;
  • @Around:定义环绕通知,包裹目标方法,在方法执行前后加入增强处理。

示例一:记录日志

作用:在方法执行之前和执行之后,分别记录日志。

在方法上加入注解@LogAnnotation

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
    String value() default "";
}

定义切面:在方法执行前和执行后记录日志

@Aspect
@Component
public class LogAspect {

    @Before(value = "@annotation(com.example.demo.LogAnnotation)")
    public void beforeMethod(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println("调用方法" + methodName + ",参数列表:" + Arrays.asList(args));
    }

    @AfterReturning(value = "@annotation(com.example.demo.LogAnnotation)",returning = "result")
    public void afterMethod(JoinPoint joinPoint,Object result) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("调用方法" + methodName + ",返回值:" + result);
    }
}

测试类:

@RestController
public class TestController {

    @RequestMapping("/test")
    @LogAnnotation("test方法")
    public String test() {
        return "Hello, World";
    }
}

当我们请求/test接口时,控制台输出:

调用方法test,参数列表:[]
调用方法test,返回值:Hello, World

示例二:异常处理

作用:当目标方法发生异常时,记录异常信息。

在方法上加入@ExceptionLog注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExceptionLog {
    String value() default "";
}

定义切面:当方法抛出异常时,记录异常信息

@Aspect
@Component
public class ExceptionAspect {

    @AfterThrowing(value = "@annotation(com.example.demo.ExceptionLog)", throwing = "e")
    public void afterThrowing(JoinPoint joinPoint, Throwable e) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("调用方法" + methodName + ",异常信息:" + e.getMessage());
    }
}

测试类:

@RestController
public class TestController {

    @RequestMapping("/test")
    @LogAnnotation("test方法")
    @ExceptionLog("test方法")
    public String test() {
        int a = 1 / 0; // 抛出异常
        return "Hello, World";
    }
}

当我们请求/test接口时,控制台输出:

调用方法test,参数列表:[]
调用方法test,异常信息:/ by zero

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Spring基于注解的AOP - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • 怎么在BIOS中开启VT?BIOS开启VT虚拟化技术图文教程

    VT(Virtualization Technology)虚拟化技术是一种硬件虚拟化技术,可以提高虚拟机的性能和安全性。如果您想在计算机上运行虚拟机,需要在BIOS中开启VT虚拟化技术。下面是BIOS开启VT虚拟化技术的图文教程: 步骤1:进入BIOS设置界面 关闭计算机,重新启动。 在计算机启动时,按下相应的按键进入BIOS设置界面。不同品牌的计算机进入B…

    html 2023年5月17日
    00
  • springboot页面国际化配置指南

    下面我将详细讲解“Spring Boot 页面国际化配置指南”的完整攻略。 前言 在当前的全球化时代,应用程序需要支持多种语言和文化,因此国际化已成为开发项目的一个重要特性。Spring Boot 提供了一种非常方便的方式来实现页面国际化,本文将介绍如何在 Spring Boot 中配置页面国际化,帮助开发者更好地支持不同语言和文化环境。 步骤 1. 创建资…

    html 2023年5月30日
    00
  • mysql数据库中字符集乱码问题原因及解决

    MySQL 数据库中字符集乱码问题是一个常见的问题,其原因主要是由于使用了不同的字符集或者在传输过程中被截断导致的。下面将详细介绍如何解决 MySQL 数据库中字符集乱码的问题。 原因 MySQL 数据库中字符集乱码问题的主要原因是由于客户端与服务器端的字符集不一致导致的,在这种情况下,当数据从客户端传输到服务器端时,可能会发生乱码。 另外,如果插入的文本数…

    html 2023年5月31日
    00
  • PHP base64编码后解码乱码的解决办法

    下面是“PHP base64编码后解码乱码的解决办法”的完整攻略。 问题描述 在使用PHP进行base64编码时,有时会出现编码成功但解码后乱码的情况。这通常是由于编码后的字符串中包含了URL安全字符“-”和“_”,而在某些特定的环境中,这些字符会被转换为其他字符(例如“+”和“/”),导致解码失败。 解决方法 要解决这个问题,有两个方法: 方法一:使用ba…

    html 2023年5月31日
    00
  • Android基础教程数据存储之文件存储

    针对 Android 基础教程中的数据存储之文件存储一章,我会给出完整的攻略,以及至少两条示例说明。 一、数据存储之文件存储 Android 系统提供了多种数据存储技术,其中文件存储技术是比较常用的一种。文件存储主要用于存储一些非结构化的数据,如图片、音频和视频等。文件存储可以分为内部存储和外部存储两种,其中内部存储又分为应用程序私有存储和应用程序公有存储两…

    html 2023年5月31日
    00
  • 简单了解XML中的命名空间

    下面我将为你详细讲解简单了解XML中的命名空间。 什么是XML中的命名空间 在XML中,元素和属性名称是没有强制性规定的,因此可能存在同名的元素或属性,所以需要使用命名空间来为XML文档中的元素和属性进行唯一标识。 命名空间是XML文档中定义元素或属性名称的URI(Uniform Resource Identifier),URI是一个字符串,用来唯一标识一个…

    html 2023年5月30日
    00
  • Android开发之XML文件解析的使用

    下面就为你详细讲解“Android开发之XML文件解析的使用”的完整攻略。 1. 什么是XML文件解析 XML文件解析是通过解析XML文件中的数据,将其转换为Java对象的过程。在Android开发中,我们经常会使用XML文件来处理数据,如布局文件、AndroidManifest.xml文件、网络请求等等,这些数据需要通过解析XML文件才能够在代码中被处理和…

    html 2023年5月30日
    00
  • python中urllib.unquote乱码的原因与解决方法

    下面我将详细讲解“Python 中 urllib.unquote 乱码的原因与解决方法”的攻略。 问题描述 在 Python 中使用 urllib.unquote 对 URL 解码时,有时会出现乱码的问题,如下所示: import urllib url = ‘https://www.example.com/%E6%88%91%E6%98%AF%E4%B8%A…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部