spring切面

概念

两个特点:

  • IOC控制反转
  • AOP主要用来处理公共的代码

例如一个案例就是添加用户,重复的代码包含了记录日志、事务提交和事务回滚等,都是重复的,为了简单,交给AOP来做。

  • 即将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决。(例如有关security,persistence,logging等不同方面的代码,)
  • 采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能。

回到添加用户的案例,把不同面的代码单独抽出去,当程序运行到方法时,例如方法前,可以动态将该面的程序动态的切进去,方法运行完也可以动态的切进去。

通过代理对象调用原来对象的方法。代理对象方法前后都可插入代码,这些代码就是增强处理。动态代理的经典实现。

所谓面向切面编程,即一种通过预编译和运行期动态代理的方式,实现在不修改源代码的情况下给程序动态添加功能的技术。

相关术语

增强处理:

  • 前置增强
  • 后置增强
  • 环绕增强、异常抛出增强、最终增强等类型

切入点Pointcut : 往哪里切

连接点 Join Point:切的地方会产生连接点,根据连接点获得一些参数

切面 Aspect:

目标对象 Target object:切的是谁

AOP代理:指代增强

织入 Weaving:动态切入

案例

例如下面的,插入AOP

public class UserServiceImpl implements UserServie{private UserDao userDao;@Overridepublic void show() {userDao.show();}}

想在show方法之前打印日志,show方法之后也打印日志。不建议System.out.println()。在打印日志的时候,用到log,输出打印的信息并会带上确定的时间,方便排查错误。

import org.apache.log4j.Logger;public class Log {private Logger logger = Logger.getLogger(Log.class);public static void main(String[] args){logger.info("打印日志, info");logger.debug("打印日志, debug");logger.warn("打印日志, warn");logger.error("打印日志, error");}}

如何在show方法执行结束后运行呢?
添加切点。
<aop:pointcut expression="execution( * com.kgc.service.. * . * (..))" id="point"/>
然后进行增强处理。

又例如权限拦截器中的示例:

使用Spring AOP实现权限拦截器,用于在方法执行前或执行过程中进行权限校验,例如角色检查。

    @Around("@annotation(authCheck)")public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {// 获取注解中的权限要求String mustRole = authCheck.mustRole();// 怎么拿到当前用户的登陆信息呢?RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();// 转换为servletHttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();User loginUser = userService.getLoginUser(request);// 获取用户的权限类型UserRoleEnum mustRoleEnum = UserRoleEnum.getEnumByValue(mustRole);// 如果权限要求为空,则继续执行原来的方法if (mustRoleEnum == null){return joinPoint.proceed();}// 反之,以下的代码就是必须有权限才会通过// 也要将获取到当前用户的角色转换成枚举类,方便使用UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(loginUser.getUserRole());// 如果为空则异常if (userRoleEnum == null){throw new BusinessException(ErrorCode.NOT_AUTH_ERROR);}// 要对必须有管理员权限,即mustRoleEnum为ADMIN,但是用户的权限不是管理员权限,则异常if (UserRoleEnum.ADMIN.equals(mustRoleEnum) && !UserRoleEnum.ADMIN.equals(userRoleEnum)){throw new BusinessException(ErrorCode.NOT_AUTH_ERROR);}// 其他情况就是通过权限校验的return joinPoint.proceed();}

参考

AOP切面的实现

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

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

相关文章

[Python] Python中的多重继承

文章目录 Lora中的例子 Lora中的例子 https://github.com/michaelnny/QLoRA-LLM/blob/main/qlora_llm/models/lora.py#L211C1-L243C10如果继承两个父类&#xff0c;并且父类的__init__参数不一样&#xff0c;则可以显式的调用父类init&#xff1b;如果用super().__init__()则需…

rsync服务的搭建

目录 一、rsync介绍 rsync的安装 二、rsync的语法 三、rsync命令使用 1. 本机同步 2. 远程同步 四、rsync作为服务使用 1、尝试启动rsync程序 2、rsync的配置文件介绍 注意事项&#xff1a; 3. rsyncinotify实时同步 3.依赖服务托管xinetd&#xff08;CentOS 6中rs…

【C/C++】面试基础题目收集

C 软件开发面试中常见的刷题题目通常可分为以下几大类&#xff1a;数据结构与算法、系统编程、面向对象设计、C 语言特性、并发编程等。 &#x1f9e0; 一、数据结构与算法&#xff08;力扣/牛客经典题&#xff09; 掌握 STL 和底层结构实现能力&#xff1a; &#x1f4cc; 数…

将手机网络经USB数据线和本地局域网共享给华为AP6050DN无线接入点

引言 由于最近装毕的新家所在的小区未能及时通宽带,于是家中各类无线设备如何上网就成了首要要解决的问题。 鉴于家中要联网的设备多、类型杂、支持频段也不一,总是开手机热点不是回事儿,于是就想着把手机网络引至华为AP6050DN无线接入点中,让家中所有的无线设备都能快速高…

【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​

深度优先搜索 导读&#xff1a;从广度到深度&#xff0c;探索图的遍历奥秘一、深度优先搜索二、算法思路三、算法逻辑四、算法评价五、深度优先生成树六、有向图与无向图结语&#xff1a;深潜与回溯&#xff0c;揭开图论世界的另一面 导读&#xff1a;从广度到深度&#xff0c;…

Flink CEP实践总结:使用方法、常见报错、优化与难点应对

Flink CEP实践总结&#xff1a;使用方法、常见报错、优化与难点应对 随着实时数据分析需求的提升&#xff0c;Flink CEP&#xff08;Complex Event Processing&#xff0c;复杂事件处理&#xff09;成为事件流检测中的利器。本文结合实际项目经验&#xff0c;总结Flink CEP的基…

Python数据类型详解:从字符串到布尔值,一网打尽

Python是现代编程语言中非常流行的一种&#xff0c;它的语法简洁、易懂&#xff0c;非常适合初学者。而在Python编程中&#xff0c;“数据类型”是最基础也是最重要的概念。理解这个概念&#xff0c;将为你之后的编程打下坚实的基础。 1. 什么是数据类型&#xff1f; 在Pytho…

python打卡day42

Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度&#xff0c;但标准的前向传播和反向传播过程通常是一个黑盒&#xff0c;很难直接访问中间层的信息。PyT…

中国风展示工作总结商务通用PPT模版

中国风展示工作总结商务通用PPT模版&#xff1a;中国风商务通用PPT 模版https://pan.quark.cn/s/42ad18c010d4

TeleAI发布TeleChat2.5及T1正式版,双双开源上线魔乐社区!

5月12日&#xff0c;中国电信开源TeleChat系列四个模型&#xff0c;涵盖复杂推理和通用问答的多个尺寸模型&#xff0c;包括TeleChat-T1-35B、TeleChat-T1-115B、TeleChat2.5-35B和TeleChat2.5-115B&#xff0c;实测模型性能均有显著的性能效果。TeleChat系列模型基于昇思MindS…

机器视觉2D定位引导一般步骤

机器视觉的2D定位引导是工业自动化中的核心应用,主要用于精确确定目标物体的位置(X, Y坐标)和角度(旋转角度θ),并引导机器人或运动机构进行抓取、装配、对位、检测等操作。其一般步骤可概括如下: 一、系统规划与硬件选型 明确需求: 定位精度要求(多少毫米/像素,多少…

儿童节快乐,聊聊数字的规律和同余原理

某年的6月1日是星期日。那么&#xff0c;同一年的6月30日是星期几&#xff1f; 星期是7天一个循环。所以说&#xff0c;这一天是星期几&#xff0c;7天之后同样也是星期几。而6月30日是在6月1日的29天之后&#xff1a;29 7 4 ... 1用29除以7&#xff0c;可以得出余数为1。而…

最佳实践|互联网行业软件供应链安全建设的SCA纵深实践方案

在数字化转型的浪潮中&#xff0c;开源组件已成为企业构建云服务与应用的基石&#xff0c;但其引入的安全风险也日益凸显。某互联网大厂的核心安全研究团队&#xff0c;通过深度应用软件成分分析&#xff08;SCA&#xff09;技术&#xff0c;构建了一套覆盖开源组件全生命周期管…

Docker Compose(容器编排)

目录 什么是 Docker Compose Docker Compose 的功能 Docker Compose 使用场景 Docker Compose 文件&#xff08;docker-compose.yml&#xff09; Docker Compose 命令清单 常见命令说明 操作案例 总结 什么是 Docker Compose docker-compose 是 Docker 官方的开源项…

【网络安全】轻量敏感路径扫描工具

订阅专栏,获取文末项目源码。 文章目录 工具简介工具特点项目结构使用方法1.环境准备2.配置目标URL3.运行扫描4.结果查看5.自定义扩展项目源码工具简介 该工具是一款基于Python的异步敏感路径扫描工具,用于检测目标网站是否存在敏感文件或路径泄露(如配置文件、密钥、版本控…

SpringAI+DeepSeek大模型应用开发实战

内容来自黑马程序员 这里写目录标题 认识AI和大模型大模型应用开发模型部署方案对比模型部署-云服务模型部署-本地部署调用大模型什么是大模型应用传统应用和大模型应用大模型应用 大模型应用开发技术架构 SpringAI对话机器人快速入门会话日志会话记忆 认识AI和大模型 AI的发…

高温炉制造企业Odoo ERP实施规划与深度分析报告

摘要 本报告旨在为高温炉生产企业提供一个基于Odoo 18平台的企业资源规划&#xff08;ERP&#xff09;系统实施的全面分析与规划。报告首先系统梳理了高温炉制造业独特的业务流程特点&#xff0c;随后详细映射了Odoo 18各核心模块功能与这些业务需求的匹配程度。重点分析了生产…

简述什么是全局锁?它的应用场景有哪些?

全局锁是数据库管理系统中的一种特殊锁机制&#xff0c;用于对整个数据库实例进行加锁&#xff0c;使数据库处于只读状态&#xff0c;阻止所有数据更新&#xff08;DML&#xff09;、数据定义&#xff08;DDL&#xff09;及更新类事务提交等操作。 其核心应用场景包括&#xf…

window 显示驱动开发-呈现开销改进(二)

对共享表面的纹理格式支持 驱动程序应支持共享资源和可共享的后台缓冲区&#xff0c;以使用 DXGI_FORMAT 枚举中的这些附加纹理格式&#xff1a; DXGI_FORMAT_A8_UNORMDXGI_FORMAT_R8_UNORMDXGI_FORMAT_R8G8_UNORMDXGI_FORMAT_BC1_TYPELESS\*DXGI_FORMAT_BC1_UNORMDXGI_FORMAT…

jenkins集成gitlab实现自动构建

jenkins集成gitlab实现自动构建 前面我们已经部署了Jenkins和gitlab&#xff0c;本文介绍将二者结合使用 项目源码上传至gitee提供公网访问&#xff1a;https://gitee.com/ye-xiao-tian/my-webapp 1、创建一个群组和项目 2、添加ssh密钥 #生成密钥 [rootgitlab ~]# ssh-keyge…