如何完整追踪并复现 Spring AOP 源码学习全过程?
摘要:Spring AOP 各阶段的流程图 简而言之, 可以分为四部步走 一是 在 spring aop 最初的入口是在哪? 二是 spring 如何解析配置, 如何封装关于AOP概念配置对象的? 三是 spring 如何根据配置对象创建代理对象
Spring AOP 各阶段的流程图
简而言之, 可以分为四部步走
一是 在 spring aop 最初的入口是在哪?
二是 spring 如何解析配置, 如何封装关于AOP概念配置对象的?
三是 spring 如何根据配置对象创建代理对象?
四是 调用代理对象方法的过程, spring 是如何拦截的?
一、Spring AOP 的入口
AOP 的入口点 (XML)
在XML中配置 <aop: ../> 启用Aop标签, 在解析XML自定义标签时, 会拿到 AopNamespaceHandler 命名空间处理器:
public class AopNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
// In 2.0 XSD as well as in 2.5+ XSDs
registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());
registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());
registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());
// Only in 2.0 XSD: moved to context namespace in 2.5+
registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
}
registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());其内部的注册的 ConfigBeanDefinitionParser 做了两件事
注册一个名称为org.springframework.aop.config.internalAutoProxyCreator 的Bean Definition(对AOP处理);
对应的类, 根据情况有以下三个可能: org.springframework.aop.config.AopConfigUtils#APC_PRIORITY_LIST, 系统会按优先级注册以下三个自动代理创建器之一:
AnnotationAwareAspectJAutoProxyCreator (最高优先级)
当项目中存在AspectJ依赖时启用
支持@Aspect注解的切面、@Before、@After等通知注解
继承自 AspectJAwareAdvisorAutoProxyCreator
能够识别并处理基于注解的切面定义
AspectJAwareAdvisorAutoProxyCreator (第二优先级)
当项目中存在AspectJ依赖但不需要注解支持时启用
主要处理XML配置的切面定义
继承自 InfrastructureAdvisorAutoProxyCreator
提供对AspectJ切点表达式的解析能力
InfrastructureAdvisorAutoProxyCreator (最低优先级)
当项目中不存在AspectJ依赖时启用
只处理基础的advisor,不支持切面编程
是最基础的自动代理创建器
适用于简单的拦截器场景
注册过程通过AopConfigUtils.registerAutoProxyCreatorIfNecessary方法实现,该方法会根据classpath中是否存在AspectJ相关类来决定注册哪个具体的实现类。
