AOP

AOP介绍

AOP是Aspect Oriented Programing的简称,面向切面编程,基于IOC实现的泛持久化动态代理。
作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。
AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理。

  • 静态代理的代表为AspectJ
  • 而动态代理则以Spring AOP为代表

所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

AOP的优点

  • 避免重复代码
  • 减少对业务的代码侵入

AOP应用场景

AOP应用场景 举例
权限 对一部分Controller里的action进行权限验证
针对验证和授权的全面和扩展支持
防止session fixation、点击劫持和交叉站点请求伪装等各种攻击
Spring Security框架
缓存 为系统透明地增加缓存支持
内容传递 将匹配的相应参数或对象自动传递给通知方法
错误处理 统一处理异常和日志
延迟加载 通过AOP接管POJO实例化过程实现懒加载
调试 日志拦截
记录跟踪、优化、校准 记录访问日志
性能优化 对所有的Service层里的方法进行耗时统计
持久化 数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)
资源池 在开发过程中,我们常会用到一些资源池,比如线程池、数据库连接池。在操作这些资源池之后,将一开始得到的资源池对象释放回资源池。
同步 mysql和redis的数据同步
事务 对Service里的某些方法进行事务管理,让其方法具有原子性

AOP原理

  • 在 Spring 的底层,如果我们配置了代理模式,Spring会为每一个Bean创建一个对应的ProxyFactoryBean的FactoryBean来创建某个对象的代理对象。
  • Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。
  • JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
  • 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。
  • CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

AOP的基本概念

术语 解释 大白话解释
Joinpoint(连接点) 所谓连接点是指那些被拦截到的点。
这些点指的是方法。
谁可以被拦截?
Pointcut(切入点) Pointcut(切入点) 拦截谁?
Advice(通知/增强) 指拦截到Joinpoint之后所要做的事情就是通知。通知分为前置通知、后置通知、异常通知、最终通知,环绕通知(切面要完成的功能)。 什么时候拦截?
拦截后做什么?
Introduction(引介) 一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field。 动态代理的基本概念
Target(目标对象) 代理的目标对象
Weaving(织入) 把增强应用到目标对象来创建新的代理对象的过程。
Proxy(代理) 一个类被AOP织入增强后,就产生一个结果代理类。
Aspect(切面) 切入点和通知(引介)的结合。 拦截谁?
什么时候拦截?
拦截后做什么?

AOP执行流程

  1. 创建自己的 Around 注解,注解参数为 Class。
  2. 在 IOC 创建 Bean 之前,优先扫描包下所有类的所有方法,把包含 Around 注解方法存储至容器。
  3. 在 IOC 扫描 Bean 的时候,检索 Bean 内部是否包含注解其类型为 Around 注明的 Class。并选择性进行 IOC 是否需要代理。
  4. 在需要代理的场景下进行切面的调用整合、执行前后进行控制。
坚持原创技术分享,您的支持将鼓励我继续创作!