暗中观察

spring aop 知识点
一、基础简介我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比...
扫描右侧二维码阅读全文
10
2018/09

spring aop 知识点

一、基础简介

我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如权限控制、异常处理、缓存、事务管理、日志记录、数据校验等等。

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为 spring 只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.spring采用动态代理织入,而AspectJ 采用编译期织入和类装在期织入
Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类
Aspect(切面): 是切入点和通知(引介)的结合

二、分类

Aop 主要分为静态代理动态代理 !
动态代理又分为两类:jdk动态代理和CGLib动态代理 !

静态代理 就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强 !

JDK动态代理主要涉及到两个类:Proxy和InvocationHandler.其中InvocationHandler是一个接口,可以通过实现接口定义横切逻辑,并通过反射机制调用目标类的代码,动态的将横切逻辑和业务逻辑编织在一起 !

CGLib动态代理底层采用字节码技术.可以为一个类创建子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑!通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的!如果目标类没有实现接口,使用此代理!

三、原理及区别

静态代理:
aop-JTDL.png

jdk动态代理:
aopjdk.png

cglib代理 :
aopcglib.png

四、配置方式

两种方式: 注解配置AOP 和 XML配置AOP
注解配置AOP: @Aspect , @Around , @Order , @Before , @After , @AfterReturning , @AfterThrowing
XML配置AOP:
aopxml.png

四、性能比较

JDK动态代理的运行速度已经逐渐提高了,在低版本的时候,运行的性能可能不如CGLib,但是在1.8版本中运行多次,基本都可以得到一致的测试结果,那就是JDK动态代理已经比CGLib动态代理快了!

五、参考

https://www.jianshu.com/p/82d58edceddb

Last modification:September 11th, 2018 at 08:02 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment