Springboot项目快速实现Aop功能

下面是关于“Springboot项目快速实现Aop功能”的完整攻略,希望对你有帮助。

什么是AOP

AOP,全称为Aspect Oriented Programming,即面向切面编程。它是一种基于OOP的扩展,旨在通过预编译方式和运行期动态代理实现程序的透明化、模块化、松耦合等功能。通俗的理解就是,把一些常用功能提取出来,不用在每个业务场景都写一遍,比如日志记录、权限校验、性能统计等。

Springboot项目快速实现Aop功能

添加依赖

在pom.xml文件中添加如下依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

编写切面

编写一个切面类,并在其中编写需要执行的逻辑代码,例如打印日志等。

@Aspect
@Component
public class LogRecordAspect {

    private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class);

    /**
     * 定义切入点
     */
    @Pointcut("execution(* com.example.demo.controller..*.*(..))")
    public void logRecord() {
    }

    /**
     * 在切入点执行前执行
     */
    @Before("logRecord()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 方法执行前打印日志
        logger.info("=====方法开始执行=====");
        // 获取方法参数
        Object[] args = joinPoint.getArgs();
        if (args != null) {
            for (Object arg : args) {
                logger.info("参数:" + arg.toString());
            }
        }
    }

    /**
     * 在切入点执行后执行,无论是否发生异常
     */
    @After("logRecord()")
    public void doAfter(JoinPoint joinPoint) {
        // 方法执行后打印日志
        logger.info("=====方法执行结束=====");
    }

    /**
     * 在切入点执行后,发生异常时执行
     */
    @AfterThrowing(pointcut = "logRecord()", throwing = "ex")
    public void doAfterThrowing(JoinPoint joinPoint, Exception ex) {
        // 方法执行后抛出异常时打印日志
        logger.info("=====方法执行异常=====");
        logger.error("异常信息:" + ex.getMessage());
    }

}

测试代码

为了演示该切面类的使用,我们编写一个简单的测试类。

@RestController
public class IndexController {

    @RequestMapping("/")
    public String index() {
        return "Hello, world!";
    }

    @RequestMapping("/test")
    public String test(String name) {
        if (name == null || "".equals(name.trim())) {
            throw new RuntimeException("参数name不能为空!");
        }
        return "Hello, " + name + "!";
    }

}

测试结果

启动应用,访问 / 和 /test 接口,控制台输出如下所示。

2021-09-06 17:57:56.987  INFO 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect            : =====方法开始执行=====
2021-09-06 17:57:56.988  INFO 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect            : 参数:null
2021-09-06 17:57:57.029 ERROR 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect            : =====方法执行异常=====
2021-09-06 17:57:57.030 ERROR 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect            : 异常信息:参数name不能为空!
2021-09-06 17:57:57.030  INFO 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect            : =====方法执行结束=====

从日志中可以看出,在执行 / 接口时,没有产生异常,控制台只输出了方法开始执行和方法执行结束的日志;当执行 /test 接口时,产生了 RuntimeException 异常,控制台输出了方法开始执行、参数、方法执行异常和方法执行结束的日志。

以上就是快速实现Aop功能的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot项目快速实现Aop功能 - Python技术站

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

相关文章

  • mybatis高级映射一对多查询实现代码

    以下是“mybatis高级映射一对多查询实现代码”的完整攻略。 一、什么是一对多查询 Mybatis中,一对多查询指的是查询一个实体对象时,它包含了多个关联对象。比如我们要查询一篇文章及其所有的评论,文章就是主实体对象,评论则是关联对象,一个文章可以对应多个评论,这就是一对多关系。 二、mybatis高级映射一对多查询实现代码 Mybatis中,要实现一对多…

    Java 2023年6月1日
    00
  • 手把手写Spring框架

    手把手写Spring框架攻略 如果想手写一个Spring框架,可以按照以下步骤: 1.了解Spring框架的设计原理 Spring框架的设计原理是基于反转控制(IoC)和面向切面编程(AOP)。反转控制是指通过配置文件或注解将对象的创建和依赖注入由应用程序翻转到容器来管理,而不是应用程序管理。面向切面编程则是指通过 AOP 技术,在不修改原有代码的情况下,在…

    Java 2023年5月19日
    00
  • java连接Oracle数据库的方法解析

    下面是Java连接Oracle数据库的方法解析的完整攻略。 一、准备工作 1.1 下载Oracle JDBC驱动 在Java连接Oracle数据库之前,需要先下载Oracle JDBC驱动程序,可以前往Oracle官网进行下载。 1.2 配置Oracle环境变量 将Oracle的安装目录加入环境变量中,以便Java程序能够正常连接Oracle数据库。 二、J…

    Java 2023年5月19日
    00
  • Java 精炼解读类和对象原理

    Java 精炼解读类和对象原理 什么是类和对象 在面向对象编程(Object-Oriented Programming,简称OOP)的思想中,类和对象是两个重要的概念。类是一种数据类型,它定义了一组属性和方法,而对象则是类的一个实例,具有这个类所定义的属性和方法。 类的定义和使用 在Java中,通过class关键字来定义一个类,格式如下所示: public …

    Java 2023年5月26日
    00
  • Java的Struts框架报错“NullUserException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“InvalidCancelException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 取消操作:如果取消操作不正确,则可能出现此错误。在这种情况下,需要检查取消操作以解决此问题。 以下是两个实例: 例 1 如果配置…

    Java 2023年5月5日
    00
  • 浅谈JAVA中输入输出流实例详解

    浅谈JAVA中输入输出流实例详解 Java中的输入输出流(IO流)是指用于处理与设备或文件之间的输入输出的一组类和接口。Java中的IO流分为输入流和输出流,输入流主要是将数据从文件或其他设备读入到内存中,输出流主要是将数据从内存中写入到文件或其他设备中。 Java中的输入输出流分类 Java中的输入输出流可以分为四类: 字节流:以字节为单位进行数据传输。字…

    Java 2023年5月26日
    00
  • Java控制台输入数组并逆序输出的方法实例 原创

    Java控制台输入数组并逆序输出的方法实例 题目描述: 在Java环境下,使用控制台输入一个整型数组,然后将数组逆序输出。请给出解决该问题的方法。 解决方案: 1.使用Scanner类进行控制台输入,然后利用Collections.reverse()方法逆序输出数组。 import java.util.*; public class InputReverse…

    Java 2023年5月26日
    00
  • Java线程安全的计数器简单实现代码示例

    下面就是“Java线程安全的计数器简单实现代码示例”的完整攻略。 什么是线程安全? 在讲解线程安全的计数器实现前,必须先了解什么是线程安全。简而言之,线程安全是指程序的多线程执行不会影响程序整体执行结果的正确性。 在Java中,线程安全通常是指多线程执行同样的代码时,不会出现数据竞争、死锁等问题。 如何实现线程安全的计数器? 实现线程安全的计数器,可以采用多…

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