【Java】Spring-AOP与拦截器简洁实操 (上手图解)

2024-09-02 07:12

本文主要是介绍【Java】Spring-AOP与拦截器简洁实操 (上手图解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


文章目录

  • Java系列文章目录
  • 一、前言
  • 二、学习内容:
  • 三、问题描述
  • 四、解决方案:
    • 4.1 认识依赖
    • 4.2 使用AOP与拦截器
      • 4.2.1 使用AOP
        • 4.2.1.1 设置DemoAop类
        • 4.2.2.2 设置切面
        • 4.2.2.3 设置方法的切点运行情况
      • 4.2.2 使用拦截器
      • 4.2.3 测试结果与总结
        • 4.2.3.1 观察内容
        • 4.2.3.2 现象总结
  • 五、总结:

一、前言

  • 学习Spring-AOP与拦截器
  • 有时候使用AOP时不知道他们的执行顺序与关系

二、学习内容:

  • Spirng-AOP实操
  • 拦截器实操

三、问题描述

  • 学习相关注解

🌟 学习执行顺序


四、解决方案:

4.1 认识依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  • 引入依赖后可使用Spring-AOP

4.2 使用AOP与拦截器

4.2.1 使用AOP

4.2.1.1 设置DemoAop类
  • 使用@Aspect注解

在这里插入图片描述

4.2.2.2 设置切面

设置切点使用@Pointcut

  • execution(访问修饰符 返回值类型 方法全称)

以下是使用的方法
execution(* com.example.service….(…))
com.example.service. :完整的包路径
com.example.service… :com.example.service下面所有的子孙包
com.example.service…* :com.example.service下面所有的子孙包的所有类
com.example.service…. :com.example.service下面所有的子孙包的所有类的所有方法
com.example.service….(…) :com.example.service下面所有的子孙包的所有类的所有方法,参数打两个点表示任何方法参数(…),即忽略参数

如图所示:
在这里插入图片描述

4.2.2.3 设置方法的切点运行情况
  • @Before:在目标方法之前运行:前置通知
  • @After:在目标方法之后运行:后置通知
  • @AfterReturning:在目标方法正常返回之后:返回通知
  • @AfterThrowing:在目标方法抛出异常后开始运行:异常通知
  • @Around:环绕:环绕通知

在这里插入图片描述
一般对接口进行切面比较方便这里只是举例直接切方法

切点代码如下:

@RestController
@RequestMapping("/demo")
public class DemoController {@GetMapping("/index")public Result index() {System.out.println("这是demoController...");return Result.success("success");}@GetMapping("/error")public Result error() {System.out.println("这是异常errorController...");throw new RuntimeException("模拟异常");}
}

设置切面类:

@Aspect
@Component
@Slf4j
public class DemoAop {@Autowiredprivate HttpServletRequest request;//  @Pointcut("execution(* org.example.aoptest.controller.DemoController.index(..))")@Pointcut("execution(* org.example.aoptest.controller.*.*(..))")public void pt(){System.out.println("这是pt切面");}@Before("pt()")public void before(){System.out.println("这是before切面");}@After("pt()")public void after(){System.out.println("这是after切面");}@AfterReturning(pointcut = "pt()", returning = "result")public void afterReturning(Object result) {System.out.println("这是afterReturning切面");}@AfterThrowing(pointcut = "pt()", throwing = "ex")public void afterThrowing(Exception ex) {System.out.println("这是afterThrowing切面: " + ex.getMessage());}@Around("pt()")public Object exec(ProceedingJoinPoint pjp) throws Throwable {System.out.println("这是around切面...before...");String token = request.getHeader("Authorization");log.info("token:{}",token);if (token.equals("1")){Object process = pjp.proceed();return process;}System.out.println("这是around切面...after...");return Result.error();}}

4.2.2 使用拦截器

拦截器详细的之后总结,我们主要观察AOP与拦截器的顺序

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate DemoInterceptor demoInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {System.out.println("==========");System.out.println(demoInterceptor);System.out.println("==========");registry.addInterceptor(demoInterceptor).addPathPatterns("/**");}
}
  • WebMvcConfigurer 是 Spring MVC 中的一个接口,用于定制 Web MVC的功能,如添加拦截器、视图解析器、配置静态资源等。实现该接口可以按需调整框架行为,优化 Web 层的功能而不必直接修改默认设置。
@Component
public class DemoInterceptor implements HandlerInterceptor {public DemoInterceptor(){System.out.println("=========================");System.out.println(this);System.out.println("=========================");}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle被调用...");return HandlerInterceptor.super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle被调用...");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}}
  • HandlerInterceptor 是 Spring框架中的一个接口,它定义了请求处理的拦截器。实现该接口可以创建自定义的拦截器类

  • 测试的时候要加上请求头

在这里插入图片描述

4.2.3 测试结果与总结

4.2.3.1 观察内容

观察图片区别

  • AOP类里面我们获取请求头是Authorization的数据
    在这里插入图片描述
  • 请求头正确且token正确

token为1:
在这里插入图片描述

  • 请求头正确但token错误

这个可以看出如果不能进入方法那么@Before@After也不能执行

token为2:
在这里插入图片描述

  • 请求头错误

在这里插入图片描述

  • error方法测试

在这里插入图片描述

4.2.3.2 现象总结

🌟 很明显方法与Before与After是一体的
🌟 其中@AfterThrow@AfterReturning是在方法执行后出现的优先级比@Before@After

在这里插入图片描述


五、总结:

🌟 很明显方法与Before与After是一体的
🌟 其中@AfterThrow@AfterReturning是在方法执行后出现的,优先级比@Before@After

  • 日志记录:在方法执行前后自动记录日志。
  • 事务管理:自动处理数据库事务的开始、提交和回滚。
  • 权限控制:在方法执行前进行权限验证。
  • 性能监控:记录方法执行时间和调用频率等性能指标。
  • 缓存策略:限定条件下缓存方法返回结果,提高性能。

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述

这篇关于【Java】Spring-AOP与拦截器简洁实操 (上手图解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129340

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有