Spring AOP实现源码分析(一) 博客分类: spring springaop
程序员文章站
2024-02-13 16:35:52
...
Spring AOP的实现可以分为三大部分
1. 注册AOP功能具体实现类
2. 普通Bean实例化时AOP的切入
3. AOP切入具体流程
本文主要讲第一部分
1. 注册AOP功能具体实现类
1.1 初始化aop自定义标签解析器 AspectJAutoProxyBeanDefinitionParser
当 xml 中读到 aop:aspectj-autoproxy 的字段,自动注册 AspectJAutoProxyBeanDefinitionParser
protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate){ if (delegate.isDefaultNamespace(root)) { if (delegate.isDefaultNamespace(ele)) { parseDefaultElement(ele, delegate); } else { // aop xml配置进入此处,共分为两步 // 1. 获取aop的解析器 2. 使用解析器,注册aop的实现类 delegate.parseCustomElement(ele); } } else { delegate.parseCustomElement(root); } } // delegate具体实现类BeanDefinitionParserDelegate public BeanDefinition parseCustomElement(Element ele) { return parseCustomElement(ele, null); } public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { String namespaceUri = getNamespaceURI(ele); // resolve() 方法会返回具体处理的handler, // handler初始化, 即aop标签解析器的注册就是在里面完成的 NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri); // 1.2会对此做详细介绍,调用aop解析器的parse方法,完成aop功能类bean的注册 return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd)); } public NamespaceHandler resolve(String namespaceUri) { // namespaceUri = "http://www.springframework.org/schema/aop" // handlerOrClassName = "org.springframework.aop.config.AopNamespaceHandler" Map<String, Object> handlerMappings = getHandlerMappings(); Object handlerOrClassName = handlerMappings.get(namespaceUri); ...... Class<?> handlerClass = ClassUtils.forName(className, this.classLoader); NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass); // namespaceHandler为 AopNamespaceHandler, 调用handler初始化init() namespaceHandler.init(); ...... } // 最终注册处理aop解析器 AspectJAutoProxyBeanDefinitionParser AopNamespaceHandler.init(){ registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser()); }
1.2 解析器进行解析,AspectJAutoProxyBeanDefinitionParser是BeanDefinitionParser子类,在最终parse过程中,其parse()函数最终会注册AnnotationAwareAspectJAutoProxyCreator(此类是aop的功能实现类),最终AnnotationAwareAspectJAutoProxyCreator对象转换为 RootBeanDefinition对象,进入Ioc container
// 1.1中的解析函数,继续分析 public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { String namespaceUri = getNamespaceURI(ele); // resolve() 方法会返回具体处理的handler, // handler初始化, 即aop标签解析器的注册就是在里面完成的 NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri); // 1.2会对次做详细介绍,调用aop解析器的parse方法,完成aop功能类bean的注册 return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd)); } // AspectJAutoProxyBeanDefinitionParser public BeanDefinition parse(Element element, ParserContext parserContext) { AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element); extendBeanDefinition(element, parserContext); return null; } // AopNamespaceUtils public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) { return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source); } private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) { // 初始化bean, aop的实现类AnnotationAwareAspectJAutoProxyCreator进行实例化, // 封装为RootBeanDefinition, 进入Ioc容器, registry 实际是 DefaultListableBeanFactory RootBeanDefinition beanDefinition = new RootBeanDefinition(cls); beanDefinition.setSource(source); beanDefinition.getPropertyValues().add(""order"", Ordered.HIGHEST_PRECEDENCE); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition); return beanDefinition; }
推荐阅读
-
Spring AOP实现源码分析(一) 博客分类: spring springaop
-
Spring AOP实现源码分析(二) 博客分类: spring srpingaop
-
Spring AOP 常用的四种实现方式 博客分类: 框架开发 springaop
-
通过Spring AOP实现Spring MVC自定义注解验证器 博客分类: springspring-mvcAOP springspring-mvcAOP
-
spring源码学习系列4.2-spring aop原理-codes 博客分类: spring springaop设计模式
-
spring源码学习系列4.1-spring实现对ibatis的事务管理 博客分类: spring spring
-
记我的第一次spring aop项目实践 博客分类: Java aopspringaspectjspring aop日志记录
-
Spring的IoC容器实现原理(一)#loadBeanDefinition 博客分类: Spring SpringIoC
-
二、Spring源码分析——BeanFactory 博客分类: Spring Spring源码分析BeanFactory
-
Spring基本用法7——AOP的支持(一) 博客分类: Spring SpringAOP架构Web三大框架