springAOP的理解和具体实现
AOP:Aspect-OrientedProgramming 面向切面编程。其实是对OOP(面向对象编程)的补充和完善
简单点描述就是OOP有些事做起来很麻烦,很不方便,而利用AOP是可以很快很便捷的处理。
OOP引入封装、继承、多态等概念去公共对象的处理。但对于公共行为的时候就不好弄。此时就衍生出AOP。
比如对于统一日志的记录、授权校验都是可以使用AOP很好的处理。
AOP的主要优点:1、集中处理某一类问题;2、降低相同的代码出现在不同的地方,降低模块间的耦合。
AOP常见的场景:1、用户登录和鉴权;2、统一日志记录;3、统一执行时间统计;4、统一的返回格式设置;5、统一的一场处理;6、事务的开启和提交。
AOP主要由哪些组成:
切面、切点、通知、连接点。
具体实现步骤;
1、引入依赖
2、demo类
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Aspect @Component public class AopDemo { @Pointcut("execution(* org.ongoal.tun.demos.web.DeviceController.*(..))") public void pointCut(){ } @Before("pointCut()") public void doBefore(){ System.out.println("执行前置通知:" + LocalDateTime.now()); } @After("pointCut()") public void doAfter(){ System.out.println("执行后置通知:" + LocalDateTime.now()); } @Around("pointCut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("开始执行环绕通知:"); Object proceed = joinPoint.proceed(); System.out.println("结束环绕通知"); return proceed; } }
从打印的结果也能知道,每个通知执行的顺序也不一样,触发的时间段不一样。
AOP的的底层实现是动态代理,spring动态代理由两种技术实现:1、JDK动态代理;2、CGLib代理;
1、JDK动态代理:通过Java提供的java.lang.reflect.Proxy类创建代理对象,要求目标类至少是一个接口,通过接口代理对象。简单点说就是代理对象通过调用相同的接口去出发代理器。JDK动态代理底层是利用反射实现的。 重点:接口、反射。
2、CGLib动态代理:对于没有接口的目标类,使用CGLib来创建代理对象,会生成目标类的子类作为代理,在方法的前后插入切面逻辑,CGLib底层是字节码框架ASM实现的。 重点:继承(目标类不能用final修饰的类),ASM
无论是哪种代理方法,其本质都是代理对象去调用原对象的方法,那如何去调用呢,可以通过接口的实现类的方法调用到接口的方法(JDK动态代理),或者通过子类去调用父类的方法(CGLib代理)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)