如何完整追踪并复现 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相关类来决定注册哪个具体的实现类。
阅读全文