AOP读书笔记

Posted dengyu的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP读书笔记相关的知识,希望对你有一定的参考价值。

什么是AOP?

AOP是面向切面编程的英文缩写,它是面向对象编程OOP的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。它遵循了设计原则只开闭原则,扩展功能不修改源代码实现。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

AOP的原理是什么?

AOP技术主要是通过Java的反射机制和设计模式的代理模式(静态代理或动态代理)实现。它不同于传统纵向继承体系重复性代码,它采用横向抽取机制,减少重复性相同的代码的工作量,使得程序员更加关注核心业务逻辑的编写,降低系统的耦合。

什么是静态代理、什么又是动态代理?

静态代理,典型的就是AspectJ,它主要是通过编译期在字节码相关的业务逻辑中织入字节码指令。你可以通过javap查看相关指令。这种模式的缺点是不过灵活业务扩展。
动态代理,它就弥补了这个缺陷,它是在运行期执行,不会改变字节码中的内容。主要的动态代理有JDK动态代理(Spring框架默认使用),但是必须实现一个接口,CGLib动态代理(依赖于ASM),javassist等等。
1)JDK动态代理:
具体实现原理:
1、通过实现InvocationHandlet接口创建自己的调用处理器
2、通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理
3、通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型
4、通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入
JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,
Spring通过java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。
2)CGLib动态代理
CGLib是一个强大、高性能的Code生产类库,可以实现运行期动态扩展java类,Spring在运行期间通过CGlib继承要被动态代理的类,重写父类的方法,实现AOP面向切面编程呢。

几种动态代理的比较?

JDK动态代理是面向接口,在创建代理实现类时比CGLib要快,创建代理速度快。
CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败),在创建代理这一块没有JDK动态代理快,但是运行速度比JDK动态代理要快。
使用注意:
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制)
如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。

AOP的一些术语

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

参考资料

1 Spring AOP的实现原理 http://www.importnew.com/24305.html
2 AOP横行切面编程和纵向编程介绍 https://www.cnblogs.com/rogge7/p/6829885.html
3 Java动态代理机制详解(JDK 和CGLIB、Javassist、ASM )https://blog.csdn.net/luanlouis/article/details/24589193


以上是关于AOP读书笔记的主要内容,如果未能解决你的问题,请参考以下文章

Spring实战读书笔记Spring之旅

Spring实战读书笔记Spring之旅

Spring in Action读书笔记——三大特色

Spring in Action读书笔记——容器和依赖注入

读书笔记关于写读书笔记的阶段性总结

关于数据治理的读书笔记 - 数据治理路线图规划