日常学习-20240728

1、面向切面编程的通知类型和使用场景
  • 前置通知(Before Advice)
    • 定义:在目标方法执行之前执行的通知。
    • 用途:可以用来执行一些准备操作,如参数校验、权限检查等。
    • 实现方式 :在Spring中,通常通过@Before注解来标识前置通知方法。
  • 后置通知(After Advice) :
    • 定义:在目标方法执行之后执行的通知,无论方法是否成功执行。
    • 用途:可以用来执行一些清理操作,如日志记录、资源释放等。
    • 实现方式 :在Spring中,通过@After注解来标识后置通知方法。
  • 返回通知(After Returning Advice) :
    • 定义:在目标方法成功执行并返回结果之后执行的通知。
    • 用途:可以用来处理方法的返回值,或者执行一些基于返回值的逻辑操作。
    • 实现方式 :在Spring中,通过@AfterReturning注解来标识返回通知方法,并可以通过注解的returning属性来访问目标方法的返回值。
  • 异常通知(After Throwing Advice) :
    • 定义:在目标方法抛出异常之后执行的通知。
    • 用途:可以用来处理方法抛出的异常,或者执行一些基于异常的逻辑操作。
    • 实现方式 :在Spring中,通过@AfterThrowing注解来标识异常通知方法,并可以通过注解的throwing属性来访问抛出的异常对象。
  • 环绕通知(Around Advice) :可以实现控制访问的访问(如接口的访问限制),通过在注解属性中设置argNames的值为@annotation(limit)等方式拦截对应的接口,通过在环绕通知方法中传入ProceedingJoinPoint和Limit参数实现对接口的访问控制
    • 定义:在目标方法执行之前和之后都可以执行的通知,它实际上包裹了被通知的方法。
    • 用途:可以用来控制目标方法的执行流程,如实现重试、日志记录、性能监控等。
    • 实现方式 :在Spring中,通过@Around注解来标识环绕通知方法,并传入一个ProceedingJoinPoint类型的参数,通过调用该参数的proceed()方法来执行目标方法。
2、pointcut对应正则表达式解析execution(* com.example.MyService.secureMethod(..),execution(* com.example..*.update*(..)
  • execution:声明为一个切入点表达式
  • *:表示方法的返回值为任意类型
  • com.example.MyService:表示生效的具体的方法,com.example..*表示com.example下所有
  • secureMethod或者update*:指定某个或某个类型的方法
3、通过给方法添加限制调用的注解,限制接口的窗口时间内的调用次数
  1. 首先定义一个注解,用于标记需要限制调用的方法,属性可以包括允许的最大调用次数,允许调用的窗口时间等

  2. 实现AOP切面:利用Spring AOP技术,可以编写一个切面来拦截带有上述注解的方法调用。在切面方法中,可以编写逻辑来检查当前请求的调用次数是否超过了限制,如果超过则进行相应的处理(如直接返回错误、延迟处理请求等)。

  3. 结合Redis:由于AOP切面方法需要在内存中记录每个接口的调用次数和时间,因此可以使用Redis这样的缓存数据库来存储这些信息。Redis支持过期时间,可以很方便地实现按时间范围的限制。

  4. 配置拦截器:除了AOP之外,还可以通过配置拦截器(Interceptor)来实现接口调用的限制。拦截器可以在请求到达控制器之前或之后执行,因此可以在这里检查请求是否满足调用次数的限制。

  5. 集成第三方库:还有一些第三方库(如Sentinel、Resilience4j等)提供了更为丰富的限流、熔断等功能,可以直接集成到Spring Boot项目中来使用。

  6. 还可以通过自定义令牌桶和漏水桶的方式实现限制接口的调用。

相关推荐
Generalzy15 分钟前
Qt 桌面开发入门:PySide6 学习路线、架构原理与技术选型
笔记·python·学习
想做小南娘,发现自己是女生喵1 小时前
第二周学习文档 Linux C 文件操作
linux·c语言·学习
潜心一志2 小时前
图像预处理—— 图像的变换与校正(理论)
学习·计算机视觉
nmjkhome2 小时前
26 疲劳的几个重要概念(第51课)-solid works simulation
学习
程序猿乐锅2 小时前
【从0-1学习Python | 第六篇】 Python 函数:定义、参数与返回值
开发语言·python·学习
燕落南枝2 小时前
HTML 学习:input 单选、复选与文件域详解
服务器·学习·html
星恒随风13 小时前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式
qq_2842740513 小时前
数控机床编程基础与坐标系:编程六步流程、程序号/程序段/程序字格式,与右手定则下车床铣床XYZ轴判定(含考点)
笔记·学习·自动化·制造
德林恩宝13 小时前
On-Policy Distillation(OPD)学习文档
人工智能·学习·机器学习·大模型·llm·大模型微调
xxwl58514 小时前
区域赛分类题解
c++·笔记·学习·算法