springAOP
功能:
1、每个业务方法调用的权限管理:在用户调用方法前判断用户是否有权调用此方法。
2、每个方法调用的审计:记录谁调用了什么业务方法,传入参数是什么,操作是否成功。
3、数据库事务的管理:在执行数据库一系列操作前,先开启事务,在执行完后提交事务;如果执行出错,则回滚事务。
4、缓存:对业务方法返回的数据进行缓存,下次调用的时候,如果参数未变,直接从缓存中获取数据,而不再调取应用方法。
术语介绍:
Aspect:Aspect声明类似于Java中的类声明,在Aspect中会包含一些Pointcut及相应的Advice。
Joint point:标识在程序中明确定义的点,典型的包括方法调用、对类成员的访问,以及异常处理程序块的执行等。Spring中的Joint point只支持方法调用。
Pointcut:表示一组Joint point,如方法名、参数类型、返回类型等,这些Joint point通过逻辑关系组合起来,它定义了相应的Advice将要发生的地方。简单理解Pointcut(一种表达式)--用来判断在Joint point(方法调用)中执行Advice(操作)。
Advice:Advice定义了在Pointcut里面定义的程序点具体要做的操作,它通过before、around、after(return、throw、finally)来区别是在每个Joint point之前、之后还是执行前后要调用的代码。
before:在执行方法前调用Advice,比如cache功能可以在执行方法前先判断是否有缓存。
around:在执行方法前后调用Advice,这是Spring框架和应用系统一种最为常用的方法。
after:在执行方法后调用Advice,after return是方法正常返回后调用,after throw是方法抛出异常后调用。
finally:方法调用后执行Advice,无论是否抛出异常还是正常返回。
AOP proxy:AOP proxy也是Java对象,由AOP框架创建,用来完成上述的动作,AOP对象通常可以通过JDK dynamic proxy完成,或者使用CGLib完成。
Weaving:实现上述切面编程的代码织入,可以在编译时刻(AspectJ compiler),也可以在运行时刻,Spring和其他大多数Java框架都是在运行时刻生成代理。
例:
package com.gcz.ex1.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.context.annotation.Configuration; import java.util.Arrays; /** * @author guocz * @date 20210609 * AOP切面类 */ @Configuration @Aspect public class AopConfig { // 切入点--切入所有使用org.springframework.stereotype.Controller注解的类 @Around("@within(org.springframework.stereotype.Controller)") public Object simpleAop(final ProceedingJoinPoint pjp) throws Throwable { try { // 调用前处理 Object[] args = pjp.getArgs(); System.out.println("args:" + Arrays.asList(args)); // 调用原有的方法,o为原方法返回对象 Object o = pjp.proceed(); // 调完后 System.out.println("return:" + o); return o; }catch (Throwable e) { throw e; } } }
更多使用参考:https://fiend.blog.csdn.net/article/details/103400452
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-06-10 java_多线程_线程同步