欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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