spring框架核心技术的两大概念之AOP:
AOP(Aspect Oriented Programming)是相对于传统OOP来说的,在传统OOP中,代码逻辑是自上而下的,经常会出现一些横切问题,但是与业务关联不大,导致代码散落到代码各处,难以维护,而AOP则使得这些横切代码与业务代码解耦。我们经常应用到的应用场景包括但不限于日志记录,权限验证,效率检查,事务管理。
Spring中AOP主要有包括这些定义:
aspect切面:是连接点、切面、代理的一个载体,
pointcut切点:表示的连接点的集合
Joinpoint连接点: 表示程序代码中的一个点,一般指方法
target 目标对象:是原来的对象也就是被AOP代理增强的对象
Weaving 织入:目标对的方法也就是连接点方法被增强的过程被称为织入。
advice通知:是增强方法在连接点的位置以及切点方法的逻辑实现。
JoinPoint是支持五种类型:
Before:连接点执行之前执行
After:连接点正常执行之后执行
After throwing:连接点执行抛出异常的时候
After (finally):无论连接点是正常退出还是异常退出,都会执行
Around advice: 环绕通知,围绕连接点执行,例如方法调用。这是最有用的切面方式。around通知可以在方法调用之前和之后执行自定义行为。它还负责选择是继续加入点还是通过返回自己的返回值或抛出异常来快速建议的方法执行。
JoinPoint主要支持的切入点的标识符如下:
execution:用于匹配方法执行连接点,也是aop中最常用的方法,因为粒度最小,能定位到方法级别
within:粒度稍微粗点,定位到包、接口、类级别
args:与方法无关,匹配方法的入参
this:JDK代理时,指向接口和jdk生成的代理类,而cglib代理时,则指向接口以及子类
target:用于匹配当前目标对象类型的执行方法
JointPoint主要方法:
getThis():返回代理对象
getTarget():返回目标对象
ProceedingPointCut:
继承了JointPoint类,能通过调用proceed调用连接点方法或通知,或者修改入参
SpringAop与AspectJ的关系:springAop与aspectJ均为AOP思想的一种实现,而springAOP中由于语法过于复杂而难以使用,因此借助了aspectJ的语法来支持,一般是通过注解@enableAspectJAutoProxy 或者xml aop:aspectj-autoProxy的定义的方式来开启aspectJ语法的支持,springAop默认使用JDK代理来实现AOP的代理,而JDK代理的实现方式为通过继承Proxy类并实现接口来实现的,代码为ProxyGenertor.generateProxyClass返回字节流,springAop还支持另外一种代理方式,可通过proxyTargetClass来开启CGLIB的代理,cglib的实现是通过继承目标类实现的。
springAop中aspect默认是单例的,可以通过perthis来处理部分代理对象为原型对象的情况,防止有共享对象在进行aop处理的时候出现多线程的问题。
网友评论