AOP可以应用于日志记录,性能统计,安全控制,事务处理,异常处理。

AspectJ

AspectJ算是最早的AOP实现之一,Spring 中的AOP也与AspectJ进行了很好的集成,Spring自身的AOP API也努力与AspectJ保持一致。

不过Spring中的AOP只是使用了类似AspectJ的注解,但是并没有使用AspectJ的编译器或者织入器,底层依然使用的是Spring AOP。
AspectJ采用的是编译时增强,所以AspectJ需要自己的编译器来编译Java文件,还需要织入器;而Spring AOP是在运行时动态生成AOP代理。

Spring中的AOP

Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可以由IoC容器的依赖注入提供。

JDK动态代理

Spring推荐面向接口编程,因此业务对象通常都会实现一个或多个接口,此时Spring中的AOP 将采用JDK动态代理,但也可强制使用Cglib。

关于JDK的动态代理过程可以参考下文:
java动态代理实现与原理详细分析

Cglib

对于在需要代理类而不是代理接口的时候,Spring会使用Cglib代理。
使用cglib[Code Generation Library]实现动态代理,并不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码。

Cglib动态代理与JDK动态代理区别

java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

而Cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理

ASM

ASM是一个通用的Java字节码操作和分析框架。 它可以用于修改现有类或直接以二进制形式动态生成类。 ASM提供了一些常见的字节码转换和分析算法,可以从中构建自定义复杂转换和代码分析工具。 ASM提供与其他Java字节码框架类似的功能,但专注于性能。

更多介绍参考:
AOP 的利器:ASM 3.0 介绍
ASM

对比编译时增强和运行时增强

一般来说,编译时增强的 AOP 框架在性能上更有优势。因为运行时动态增强的 AOP 框架需要每次运行时都进行动态增强。

AspectJ采用编译时增强,会增加class文件数量,增加编译时间,但是运行速度更快,不用像动态代理那样每次在运行的时候都要去生成代理。

Spring中的AOP运用场景

Spring AOP在bean的生命周期中和事务的处理过程中都有运用。

Spring AOP在Bean的创建过程中的运用

Spring Aop底层原理详解(利用spring后置处理器实现AOP)
【Spring - AOP】--- AOP核心后置处理器的创建过程

Spring AOP在事务的管理过程中的运用

Spring 框架之 AOP 原理深度剖析!中的一节:Spring 框架中如何基于 AOP 实现的事务管理

如果觉得我的文章对你有用,请随意赞赏