springboot切面编程

SpringBoot切面编程

众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转。本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理。

何为AOP

AOP(Aspect OrientedProgramming):面向切面编程,面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

利用AOP可以对我们边缘业务进行隔离,降低无关业务逻辑耦合性。提高程序的可重用性,同时提高了开发的效率。一般用于日志记录,性能统计,安全控制,权限管理,事务处理,异常处理,资源池管理。使用场景

AOP的一些核心概念

概念定义作用示例
横切关注点多个模块中共同涉及的功能,如日志、事务、权限等分离通用功能,避免代码冗余所有Service方法都需要记录执行时间
切面(Aspect)封装横切关注点的模块,包含切入点和通知将横切逻辑集中管理定义一个日志切面,统一处理日志记录
连接点(Join Point)程序执行中的特定点,如方法调用、字段修改等作为切面织入的候选位置某个Service方法被调用时
切入点(Pointcut)定义切面作用的具体位置,通过表达式匹配连接点精确控制切面影响的范围匹配所有以save开头的方法
通知(Advice)切面在连接点执行的操作,分为前置、后置、返回、异常、环绕通知实现具体的横切功能在方法执行前记录参数,执行后记录返回值
织入(Weaving)将切面与目标对象连接并创建代理对象的过程使切面逻辑在特定时机生效编译时织入(AspectJ)、运行时织入(Spring AOP)
目标对象(Target)被切面包裹的对象被增强的原始业务对象实际的UserService类
代理对象(Proxy)织入切面后生成的对象替代原始对象,执行时包含切面逻辑通过JDK动态代理生成的UserService代理对象

代码实现

这段代码展示了AOP(面向切面编程)在权限校验场景中的典型应用。通过自定义注解和环绕通知,实现了方法级别的权限拦截,避免了在每个业务方法中重复编写权限校验逻辑。

1. 自定义注解 @AuthCheck
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {String mustRole() default "";
}
  • 作用:标记需要进行权限校验的方法,并指定所需的角色(如@AuthCheck(mustRole = "ADMIN"))。
  • 元注解
    • @Target(ElementType.METHOD):注解仅可用于方法。
    • @Retention(RetentionPolicy.RUNTIME):注解在运行时保留,以便反射获取。
2. 切面类 AuthInterceptor
@Aspect
@Component
public class AuthInterceptor {@Resourceprivate UserService userService;@Around("@annotation(authCheck)")public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {// 1. 获取注解中指定的必须角色String mustRole = authCheck.mustRole();// 2. 获取当前登录用户HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();User loginUser = userService.getLoginUser(request);// 3. 权限校验逻辑UserRoleEnum mustRoleEnum = UserRoleEnum.getEnumByValue(mustRole);if (mustRoleEnum == null) return joinPoint.proceed(); // 无需权限,放行UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(loginUser.getUserRole());if (userRoleEnum == null) throw new BusinessException(ErrorCode.NO_AUTH_ERROR);// 管理员权限校验if (mustRoleEnum == UserRoleEnum.ADMIN && userRoleEnum != UserRoleEnum.ADMIN) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}// 校验通过,执行原方法return joinPoint.proceed();}
}
  • 关键元素
    • @Aspect:声明该类为切面。
    • @Component:将切面注册为Spring Bean。
    • @Around("@annotation(authCheck)")
      • 环绕通知,拦截所有标记了@AuthCheck注解的方法。
      • authCheck参数绑定当前方法上的@AuthCheck注解实例。

AOP思想的体现

1. 关注点分离
  • 业务逻辑(如用户服务)与权限校验完全解耦。
  • 权限校验逻辑集中在切面中,无需在每个业务方法中重复编写。
2. 声明式编程
  • 通过@AuthCheck注解在方法上声明所需权限,简洁直观。
  • 示例:
    @AuthCheck(mustRole = "ADMIN")
    public void deleteUser(Long userId) {// 业务逻辑(无需关心权限校验)
    }
    
3. 动态代理机制
  • Spring AOP通过动态代理(JDK或CGLIB)在运行时生成代理对象。
  • 代理对象在调用目标方法前后插入权限校验逻辑:
    调用代理方法 → 执行前置校验 → 执行目标方法 → 执行后置逻辑
    

执行流程

  1. 方法调用:客户端调用标记了@AuthCheck的方法。
  2. 代理拦截:Spring AOP拦截调用,执行AuthInterceptor的环绕通知。
  3. 权限校验
    • 从注解获取所需角色(如ADMIN)。
    • 从当前请求获取登录用户信息。
    • 比较用户角色与注解要求的角色。
  4. 结果处理
    • 校验通过:执行原方法。
    • 校验失败:抛出BusinessException

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

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

相关文章

【Redis#4】Redis 数据结构 -- String类型

一、前言 1. 基本概念 理解:字符串对象是 Redis 中最基本的数据类型,也是我们工作中最常用的数据类型。redis中的键都是字符串对象,而且其他几种数据结构都是在字符串对象基础上构建的。字符串对象的值实际可以是字符串、数字、甚至是二进制&#xff0…

Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理

Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理 引言 在现代应用开发中,文件存储和管理是一个常见需求。Dufs 是一个轻量级的文件服务器,支持 WebDAV 协议,可以方便地集成到 Spring Boot 应用中。本文将详细介绍如何使用 WebDAV 协议在 Sp…

Unity打包时编码错误解决方案:NotSupportedException Encoding 437

问题描述 在Unity项目开发过程中,经常会遇到这样的情况:项目在编辑器模式下运行完全正常,但是打包后运行时却出现以下错误: NotSupportedException: Encoding 437 data could not be found. Make sure you have correct interna…

Spring Bean的生命周期与作用域详解

一、Spring Bean的生命周期 Spring Bean的生命周期指的是Bean从创建到销毁的整个过程。理解这个生命周期对于正确使用Spring框架至关重要,它可以帮助我们在适当的时机执行自定义逻辑。 1. 完整的Bean生命周期阶段 Spring Bean的生命周期可以分为以下几个主要阶段…

如何将Excel表的内容转化为json格式呢?

文章目录 一、前言二、具体操作步骤 一、前言 先说一下我使用Excel表的内容转为json的应用场景,我们是用来处理国际化的时候用到的。 二、具体操作步骤 第一步:选择要转化Excel表的内容(必须是key,value形式的) 第二…

内存堆栈管理(Linux)

以问题形式讲解 1.每一个进程都有一个堆空间吗?还是多个进程共用一个堆空间? 在操作系统中,​​每个进程都有自己独立的虚拟地址空间,其中包括自己独占的堆空间。堆空间是进程私有的,不与其他进程共享。 进程之间的内…

ThreatLabz 2025 年人工智能安全报告

AI 应用趋势:爆发式增长与风险并存 2024 年,全球企业的 AI/ML 工具使用量呈指数级增长。Zscaler 云平台数据显示,2024 年 2 月至 12 月期间,AI/ML 交易总量达 5365 亿次,同比激增 3464.6%,涉及 800 多个应…

【Oracle学习笔记】7.存储过程(Stored Procedure)

Oracle中的存储过程是一组为了完成特定功能而预先编译并存储在数据库中的SQL语句和PL/SQL代码块。它可以接受参数、执行操作(如查询、插入、更新、删除数据等),并返回结果。以下从多个方面详细讲解: 1. 存储过程的创建 创建存储过…

tc工具-corrupt 比 delay/loss 更影响性能

1. netem corrupt 5% 的作用 功能说明 corrupt 5% 表示 随机修改 5% 的数据包内容(如翻转比特位),模拟数据损坏。它本身不会直接丢弃或延迟数据包,而是让接收端收到错误的数据(可能触发校验和失败、协议层重传等&…

Flask YAML管理工具

项目概述 项目地址:https://github.com/KaiqiZing/Flask_Yaml_Demo 这是一个基于Flask开发的YAML文件管理工具,提供了完整的YAML文件查看、编辑、管理功能,具有现代化的Web界面和强大的编辑能力。 核心功能 1. 文件管理功能 目录扫描&am…

Embedding模型微调实战(ms-swift框架)

目录 简介 1. 创建虚拟环境 2 安装ms-swift 3安装其他依赖库 4. 下载数据集 5.开始embedding模型训练 6. 自定义数据格式和对应的Loss类型 (1) infoNCE损失 (2)余弦相似度损失 (3)对比学习损失 (4).在线对比学习损失 &#…

从性能优化赛到社区Committer,走进赵宇捷在Apache Fory的成长之路

Apache Fory 是一个基于JIT和零拷贝的高性能多语言序列化框架,实现了高效紧凑的序列化协议,提供极致的性能、压缩率和易用性。在多语言序列化框架技术领域取得了重大突破,推动序列化技术步入高性能易用新篇章!这一切,都…

Python实例题:基于 Flask 的任务管理系统

目录 Python实例题 题目 要求: 解题思路: 代码实现: Python实例题 题目 基于 Flask 的任务管理系统 要求: 使用 Flask 框架构建一个任务管理系统,支持以下功能: 用户认证(注册、登录、…

利用GPU加速TensorFlow

一、写在前面 我们已经依靠keras和TensorFlow给大家做了一些机器学习在图像处理中的应用(影像组学学习手册,基于深度学习的图像分类任务),此前的教程中我们没有用GPU进行加速,但是相较于CPU而言,GPU是设计用于处理大规模并行计算任务的硬件&…

模型预测专题:强鲁棒性DPCC

0 1 前言 在进行DPCC的学习过程中,于下面链接看到了一篇强鲁棒性算法;感觉挺有意思的,学习一下。 永磁同步电机高性能控制算法(12)——基于预测电流误差补偿的强鲁棒预测控制/参数辨识&有限集预测控制与连续集预…

修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题

https://wiki.archlinux.org/title/Talk:RabbitMQ 报错 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地图有哪些库

以下是前端开发GIS地图常用的库&#xff1a; Leaflet&#xff1a;轻量级、易于使用的开源JavaScript库&#xff0c;具有丰富的地图功能和插件生态系统&#xff0c;支持多种地图数据源&#xff0c;适合初学者和专业开发者。其优势在于简洁性和易用性&#xff0c;代码结构清晰&am…

赋能城市安全韧性|众智鸿图总裁扈震受邀出席智慧城市大会发表主题报告

——“众智鸿图作为城市基础设施智能化综合服务提供商&#xff0c;以地理信息科学、时空大数据、人工智能为核心能力&#xff0c;长期深耕于燃气、供水、排水等城市基础设施生命线领域及港口、园区等工业领域&#xff0c;致力于为城市稳定运行与高效发展提供坚实保障。” 2025年…

【大语言模型入门】—— 浅析LLM基座—Transformer原理

【大语言模型入门】—— 浅析LLM基座—Transformer原理 解密GPT核心技术&#xff1a;Transformer架构深度解析被反复强调的核心概念意味着什么&#xff1f; GPT预测机制解析&#xff1a;从Next Token Prediction到任务推理核心机制的本质案例驱动的机制解析解构策略&#xff1a…

Django打造智能Web机器人控制平台

Django 实现 Web 机器人控制 以下是关于 Django 实现 Web 机器人控制管理的实例思路和关键代码片段,涵盖多个常见场景。由于篇幅限制,剩余的可通过类似模式扩展。 基础机器人模型定义 # models.py from django.db import modelsclass Robot(models.Model):name = models.C…