返回
Spring AOP 源码分析四:AOP 源码解析
后端
2023-12-11 10:41:07
众所周知,AOP 框架中的各种切面肯定都是通过创建代理来实现的。但是问题随之产生了,我们已经分析了普通 Bean 的解析及创建过程,但 AOP 究竟是在哪个环节创建的代理对象的呢?又是如何创建的呢?
本篇文章将通过对 Spring AOP 源码的分析,详细讲解 AOP 框架是如何创建代理对象的,以及 AOP 框架的工作原理。
AOP 概述
AOP(Aspect Oriented Programming),即面向切面编程,是一种编程范式,它允许开发人员以一种模块化、可重用的方式来实现程序中的横切关注点。AOP 框架通过在程序中引入“切面”的概念来实现这一目标。切面是一个独立的模块,它包含了横切关注点的实现代码。AOP 框架会将切面织入到程序中,以便在程序执行过程中自动执行切面中的代码。
Spring AOP
Spring AOP 是 Spring 框架中提供的 AOP 实现。它提供了丰富的 AOP 功能,包括:
- 支持声明式 AOP :Spring AOP 允许开发人员使用声明式的方式来定义切面。这种方式使用 XML 配置文件或注解来定义切面,无需修改程序代码。
- 支持多种切面类型 :Spring AOP 支持多种切面类型,包括:前置通知、后置通知、环绕通知、异常通知和引入增强。
- 支持多种织入方式 :Spring AOP 支持多种织入方式,包括:编译时织入、加载时织入和运行时织入。
AOP 代理对象的创建
在 Spring AOP 中,代理对象的创建过程主要分为以下几个步骤:
- Bean 解析 :Spring 首先会解析 Bean 定义,并创建 Bean 实例。
- AOP 代理的创建 :在 Bean 解析之后,Spring 会对 Bean 进行 AOP 代理。如果 Bean 被标记为 AOP 切点,Spring 就会为该 Bean 创建一个代理对象。
- AOP 代理的织入 :Spring 会将 AOP 代理对象织入到程序中。织入过程是在运行时完成的,因此不会影响程序的编译和打包。
AOP 代理的创建过程
Spring AOP 中的代理对象是通过 CglibProxyFactory
和 JdkDynamicAopProxy
这两个类创建的。
CglibProxyFactory
:使用 CGLIB 库来创建代理对象。CGLIB 库是一个开源的代码生成库,它允许开发人员在运行时动态地生成 Java 类。Spring AOP 使用CglibProxyFactory
来创建代理对象,这种方式不需要修改目标类的代码,因此兼容性更好。JdkDynamicAopProxy
:使用 JDK 动态代理来创建代理对象。JDK 动态代理是一种 Java 内置的代理机制,它允许开发人员在运行时动态地创建代理对象。Spring AOP 使用JdkDynamicAopProxy
来创建代理对象,这种方式需要修改目标类的代码,因此兼容性不如CglibProxyFactory
。
总结
本文通过对 Spring AOP 源码的分析,讲解了 AOP 框架是如何创建代理对象的,以及 AOP 框架的工作原理。通过本文的学习,读者可以对 Spring AOP 有一个更深入的理解。