[springboot——01] AOP方式管理
创始人
2025-05-30 19:10:32

目录

1.引入依赖 

2.创建增强类

3.写我们的被增强类

4.运行我们的程序,访问 /aoptest

5.应用场景


AOP 概念

  • 切入点 pointcut
  • 通知 advice
  • 切面 aspect = 切入点 + 通知
  • 织入 weaving 将切面加入对象,并创建出代理对象的过程
  • 环绕通知 【最强大、灵活的通知】

1.引入依赖 

org.springframework.bootspring-boot-starter-aop

2.创建增强类

execution 表达式相关文章:AOP(execution表达式)

package com.example.demo.aop;import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;/*** @author: fly* @Date: 2023-03-19 14:50* @Description: 切面类*/
@Aspect
@Component
@Log4j2
public class AopLog {// 线程局部的变量,用于解决多线程中相同变量的访问冲突问题ThreadLocal startTime = new ThreadLocal<>();// 定义切点 com.example.demo 下面的当前包和子包下面的所有类中的所有方法// @Pointcut("execution(* com.example.demo..*.*(..))")// 针对 controller 层的 AopLog 类的 aopTest方法进行测试@Pointcut("execution(String com.example.demo.controller.AopLogController.aopTest())")public void aopWebLog() {}// 前置通知@Before("aopWebLog()")public void doBefore(JoinPoint joinPoint) {// 记录开始时间startTime.set(System.currentTimeMillis());// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();assert attributes != null;HttpServletRequest request = attributes.getRequest();log.info("URL: " + request.getRequestURL().toString());log.info("HTTP方法: " + request.getMethod());log.info("IP地址: " + request.getRemoteAddr());log.info("类的方法: " + joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName());log.info("参数: " + request.getQueryString());}// 方法抛出异常退出时执行的通知@AfterThrowing(pointcut = "aopWebLog()",throwing = "exception")public void addAfterThrowingLog(JoinPoint joinPoint,Exception exception) {log.error("执行 " + "异常",exception);}
}

 拓展知识:通知的分类

  1. @Before 前置通知
  2. @AfterReturning 后置通知
  3. @After 最终通知
  4. @AfterThrowing 异常通知
  5. @Around 环绕通知 【与上面的通知的写法稍微有点区别】
public void around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("[增强类]环绕通知前...");pjp.proceed();System.out.println("[增强类]环绕通知后...");
}

3.写我们的被增强类

 根据切入点,我们可以定位到 被增强类

@Pointcut("execution(String com.example.demo.controller.AopLogController.aopTest())")
@RestController
public class AopLogController {@RequestMapping("/aoptest")public String aopTest() {return "hello aop test!";}
}

4.运行我们的程序,访问 /aoptest

 

 

5.应用场景

  1.  将重复代码进行抽取,即代码简化
  2.  增加特定性功能,即代码增强

拓展资料:

  1. AOP —— 代码重工
  2. AOP(execution表达式)
  3. 谈谈你对IOC和AOP的理解及AOP四种实现方式

相关内容

热门资讯

三曼村:一个观察中国乡村转型的... 来源:@CGTNGlobalBusiness微博 【三曼...
俄外长:日本正加速军事化 最好... 转自:证券时报人民财讯12月28日电,俄罗斯外长拉夫罗夫在塔斯社28日播发的专访中说,日本领导层最近...
“2025上海台北城市论坛”在... 转自:北京日报客户端以“科技改变生活”为主题的“2025上海台北城市论坛”28日在沪举行。论坛旨在推...
智者勇进•接续奋进新江苏|涟水... 转自:扬子晚报2025 年,涟水县文化广电和旅游局答卷亮点纷呈 —— 省文化艺术政府奖斩获六项大奖,...
最新或2023(历届)新疆养老...  新疆养老保险个人账户查询,  1、电话查询,拨打新疆自治区12333查询热线;  "12333"热...