当前位置: 首页 > news >正文

【Spring】认识 Spring AOP

认识 Spring AOP

  • 1.什么是 AOP
  • 2.AOP 中的概念
  • 3.用 AOP 方式管理日志
    • 3.1 编写 AOP 日志注解类
    • 3.2 编写控制器用于测试

1.什么是 AOP

AOP(Aspect Oriented Program面向切面编程)把业务功能分为核心、非核心两部分。

  • 核心业务功能:用户登录、增加数据、删除数据。
  • 非核心业务功能:性能统计、日志、事务管理。

在 Spring 的面向切面编程(AOP)思想里,非核心业务功能 被定义为 切面。核心业务功能和切面功能先被分别进行独立开发,然后把切面功能和核心业务功能 编织 在一起,这就是 AOP。
在这里插入图片描述
由此可见,AOP 将业务无关,却为业务模块所共同调用的逻辑封装起来,以便减少系统的重复代码,降低模块间的耦合度,利于未来的拓展和维护。这正是 AOP 的目的,它是 Spring 最为重要的功能之一,被广泛使用。

2.AOP 中的概念

  • 切入点pointcut):在哪些类、哪些方法上切入。
  • 通知advice):在方法前、方法后、方法前后做什么。
  • 切面aspect):切面 = 切入点 + 通知。即在什么时机、什么地方、做什么。
  • 织入weaving):把切面加入对象,并创建出代理对象的过程。
  • 环绕通知:AOP 中最强大、灵活的通知,它集成了前置和后置通知,保留了连接点原有的方法。

3.用 AOP 方式管理日志

下面通过实例演示如何用 AOP 方式管理日志。

3.1 编写 AOP 日志注解类

package com.example.demo.aop;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;/*** Description:  使之成为切面类*/
@Aspect
/*** Description: 把切面类加入到IOC容器中*/
@Component
public class AopLog {private Logger logger = LoggerFactory.getLogger(this.getClass());//线程局部的变量,解决多线程中相同变量的访问冲突问题。ThreadLocal<Long> startTime = new ThreadLocal<>();//定义切点@Pointcut("execution(public * com.example..*.*(..))")public void aopWebLog() {}@Before("aopWebLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {startTime.set(System.currentTimeMillis());// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP方法 : " + request.getMethod());logger.info("IP地址 : " + request.getRemoteAddr());logger.info("类的方法 : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());//logger.info("参数 : " + Arrays.toString(joinPoint.getArgs()));logger.info("参数 : " + request.getQueryString());}@AfterReturning(pointcut = "aopWebLog()",returning = "retObject")public void doAfterReturning(Object retObject) throws Throwable {// 处理完请求,返回内容logger.info("应答值 : " + retObject);logger.info("费时: " + (System.currentTimeMillis() - startTime.get()));}//抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。@AfterThrowing(pointcut = "aopWebLog()", throwing = "ex")public void addAfterThrowingLogger(JoinPoint joinPoint, Exception ex) {logger.error("执行 " + " 异常", ex);}}
  • @Before:在切入点开始处切入内容。
  • @After:在切入点结尾处切入内容。
  • @AfterReturning:在切入点 return 内容之后切入内容(可以用来对处理返回值做一些加工处理)。
  • @Around:在切入点前后切入内容,并自己控制何时执行切入点自身的内容。
  • @AfterThrowing:用来处理当切入内容部分抛出异常之后的处理逻辑。
  • @Aspect:标记为切面类。
  • @Component:把切面类加入到 IOC 容器中,让 Spring 进行管理。

3.2 编写控制器用于测试

下面的控制器构造了一个普通的 Rest 风格的页面。

package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AopLogController {@GetMapping("/aoptest")public String aVoid(){return "hello aop test";}
}

启动项目,访问 http://localhost:8080/aoptest

在这里插入图片描述
在控制台会输出如下信息。

在这里插入图片描述

http://www.lryc.cn/news/358262.html

相关文章:

  • 什么是访问控制漏洞
  • python基于百度,哈工大等停用表进行的中文分词
  • 【学习笔记】计算机组成原理(七)
  • pillow学习4
  • 外企如何有效面对日益严格的跨境数据传输法律?
  • 运维开发.MySQL.范式与反范式化
  • HCIA-HarmonyOS Application Developer 课程大纲
  • 如何用Java实现SpringCloud Alibaba Sentinel的熔断功能?
  • Day27
  • uni-app App端实现文字语音播报(Ba-TTS)
  • 在WHM中如何调整max_upload_size 参数大小
  • docker system prune命令详解
  • 使用jdk自带jhat工具排查OOM问题
  • 独孤思维:付费就是割韭菜,千万别上当
  • 【PB案例学习笔记】-12秒表实现
  • Linux驱动开发笔记(二) 基于字符设备驱动的GPIO操作
  • 【ESP32之旅】ESP32 PlatformIO 固件单独烧录
  • 视频监控业务平台LntonCVS运用国标协议对接视频汇聚管理综合平台应用方案
  • 【Linux 网络编程】协议的分层知识!
  • Firefox国际版
  • 封装和解构是 Python 中常用的技术
  • 理解OAuth:服务间的授权机制
  • JRT性能演示
  • React 使用JSX或者TSX渲染页面
  • 【Linux】Socket中的心跳机制(心跳包)
  • Java怎样动态给对象添加属性并赋值【代码实现】
  • C#多线程同步lock、Mutex
  • 模型实战(21)之 C++ - tensorRT部署yolov8-det 目标检测
  • Linux完整版命令大全(二十一)
  • Elasticsearch集群许可证过期问题解决方法汇总