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代理)。
标签:JDK,代理,接口,理解,具体,CGLib,AOP,springAOP,public From: https://www.cnblogs.com/qwg-/p/18000609