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

news2024/9/21 14:39:49

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 观察结果
        • 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 {

    @Autowired
    private 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 {

    @Autowired
    private DemoInterceptor demoInterceptor;

    @Override
    public 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("=========================");
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle被调用...");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public 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的数据
    在这里插入图片描述

ProceedingJoinPoint

  • 这是AspectJ框架中的一个接口,代表程序执行过程中的一个连接点(如方法调用)。它提供了对目标方法的调用控制以及访问方法签名、参数等功能的方法。

exec

  • 方法名称,开发者自定义的方法名,用于执行围绕通知逻辑。

pjp.proceed()

  • 是 AspectJ 中 ProceedingJoinPoint 接口的一个方法,用于执行被拦截的目标方法。

具体说明如下:

  • 此方法会调用被环绕(around advice)的方法。在执行了前置操作之后,通过调用
    proceed()来触发原始方法的执行,并在方法完成后执行后续的操作(如后置通知)。
4.2.3.2 观察结果
  • 请求头正确且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

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

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


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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux驱动环境配置

Linux驱动环境配置 1.u-boot烧录2.Linux设置3.u-boot命令4.u-boot环境变量相关命令5.tftp安装与配置6.nfs7.配置网络环境变量8.tftp下载9.nfs挂载根文件系统 1.u-boot烧录 1.打开J-Flash 2.打开工程(Open Project) 3.Open data file 4.设置起始地址0x0 5.选择Target-Conne…

【Java毕业设计】基于SpringBoot+Vue+uniapp的农产品商城系统

文章目录 一、系统架构1、后端&#xff1a;SpringBoot、Mybatis2、前端&#xff1a;Vue、ElementUI4、小程序&#xff1a;uniapp3、数据库&#xff1a;MySQL 二、系统功能三、系统展示1、小程序2、后台管理系统 一、系统架构 1、后端&#xff1a;SpringBoot、Mybatis 2、前端…

【学术会议征稿】第三届智慧能源与电气工程国际学术会议(SEEE 2024)

第三届智慧能源与电气工程国际学术会议&#xff08;SEEE 2024&#xff09; 2024 3rd International Conference on Smart Energy and Electrical Engineering(SEEE 2024) 在双碳目标背景下&#xff0c;能源行业正在面临着绿色低碳转型的巨大挑战。随着我国产业结构全面调整&am…

show命令监控分析mysql实例信息

文章目录 思维导图show 查看数据库实例相关信息SHOW VARIABLES 分析数据库当前变量设置分析连接数据分析线程数分析慢查询变量分析缓存相关分析字符集相关SHOW STATUS 数据库当前实时状态分析分析连接数据分析线程数分析慢查询分析查询缓存分析排序使用情况分析文件打开数思维导…

09-03 周二 ansible部署与使用指南

09-03 周二 ansible部署与使用指南 时间版本修改人描述2024年9月3日10:08:58V0.1宋全恒新建文档&#xff0c;2024年9月4日13:57:25v0.2宋全恒调整结构&#xff0c;添加ansible-playbook和ansible-inventory 简介 首先要找一个跳板机&#xff0c;来确保所有的机器都可以访问。然…

OpenAI gym‘s breakout-v0 “pauses“

题意&#xff1a;OpenAI Gym 的 breakout-v0 “暂停” 问题背景&#xff1a; While training in the OpenAI gym environment I have the idea that the environment sometimes "stops". For many frames in a row no ball is visible/stops spawning. 在 OpenAI G…

网站代运维与建设:HTTP虚拟专线的优势

网站代运维与建设&#xff1a;HTTP虚拟专线的优势 企业和个人越来越依赖于网站来展示品牌形象、提供服务和与客户互动。然而&#xff0c;网站的建设和运维往往需要投入大量时间和资金&#xff0c;尤其是在服务器费用和技术维护方面。本文将探讨如何通过使用HTTP虚拟专线来降低…

【鸿蒙开发笔记】如何理解 UIAbility 组件以及它的生命周期

UIAbility 组件是一种包含了 UI 的应用组件&#xff0c;主要用于和用户交互。 UIAbility 组件是系统调度的基本单元&#xff0c;为应用提供绘制界面的窗口&#xff0c;一个应用可以有多个 UIAbility 组件。 每一个 UIAbility 组件实例都会在最近任务列表中显示为一个对应的任务…

【Python】Windows环境下更改pip安装源

文章目录 1.前言2.pip临时安装更改源3.pip永久更改安装源3.1方法13.2方法2 1.前言 由于pip的默认的安装源在国外,导致我们在使用pip命令安装Python 库或包时速度特别慢,因此我们可以临时使用国内的源进行下载,或者直接更改pip的下载源 2.pip临时安装更改源 pip install xxx …

微服务——服务注册和发现(二)

服务注册和发现 1.4.服务发现 服务的消费者要去nacos订阅服务&#xff0c;这个过程就是服务发现&#xff0c;步骤如下&#xff1a; 引入依赖 配置Nacos地址 发现并调用服务 1.4.1.引入依赖 服务发现除了要引入nacos依赖以外&#xff0c;由于还需要负载均衡&#xff0c;因…

思科IP访问控制列表3

#网络安全技术实现# #任务三扩展访问控制列表的控制3# #1配置计算机的IP 地址、子网掩码和网关 #2配置Switch-A的主机名称&#xff0c;创建vlan 10,20,30,并将Fa0/1划入vlan 10&#xff0c;Fa0/2划入vlan 20&#xff0c;G0/1划入vlan 30 Switch(config)#hostname Switch-A S…

QML学习二:Qt启用qml文件实时预览编辑,以及打印日志到控制台

开发环境&#xff1a;Qt 6.5.3 LTS 1、Qt 6.5.3 LTS 2、Pyside6 3、Python 3.11.4 效果如下&#xff0c;右侧更改的代码可以实时反映到左侧的设计器中。 Qt启用qml文件实时预览编辑&#xff0c;以及打印日志到控制台 一、打开Qt Designer插件二、qml和Python文件打印输出到…

2024年高教社杯数学建模国赛C题超详细解题思路分析

本次国赛预测题目难度&#xff0c;选题人数如下所示 难度评估 A:B:C 1.8:1.3:1 D:E1.5:1 选题人数 A:B:C 1:1.5:2.8 D:E0.5:1.2 C题一直以来都是竞赛难度最低、选题人数最多的一道本科生选题&#xff0c;近三年C题的选题人数一直都是总参赛队伍的一半左右&#xff0c;2023年…

二进制方式安装K8S

⼀、安装说明 本⽂章将演示Rocky 8 ⼆进制⽅式安装⾼可⽤k8s 1.28.0版本。 ⽣产环境中&#xff0c;建议使⽤⼩版本⼤于5的Kubernetes版本&#xff0c;⽐如1.19.5 以后的才可⽤于⽣产环境。 ⼆、集群安装 2.1 基本环境配置 请统⼀替换这些⽹段&#xff0c;Pod⽹段和service和…

如何在Jmeter安装“ Stepping Thread Group“?

1、点击"选项"&#xff0c;再点击"Plugins Manager" 2、安装插件Custom Thread Groups 3、添加"Stepping Thread Group" 4、"Stepping Thread Group"的介绍

HTML/CSS/JS学习笔记 Day1(HTML)

跟着该视频学习&#xff0c;记录笔记&#xff1a;【黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day1 内容梳理&#xff1a; …

认知升级:互联网行业中的变革引擎与团队潜能激发

一、认知升级在互联网行业的独特价值 互联网行业以其快速迭代、信息爆炸、技术创新为特点&#xff0c;对从业者提出了更高的要求。认知升级&#xff0c;作为个人成长的重要路径&#xff0c;在互联网领域展现出无可替代的价值&#xff1a; 快速适应与学习&#xff1a;互联网行业…

最基本的SELECT...FROM结构

第0种&#xff1a;最基本的查询语句 SELECT 字段名&#xff0c;字段名 FROM 表名 SELECT 1&#xff1b; SELECT 11,3*2&#xff1b; FROM SELECT 11,3*2 FROM DUAL&#xff1b;#dual&#xff1a;伪表 我们可以用它来保持一个平衡 这里我们的值不需要在任何一个表里&#xf…

傅里叶变换家族

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

Ruoyi若依框架中工单管理(智能售货机运营管理系统)

新建TaskVo Data public class TaskVo extends Task {// 工单类型private TaskType taskType; } <resultMap type"taskVo" id"TaskVoResult"><result property"taskId" column"task_id"/><result property"task…