Spring AOP实现源码分析(一)


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;
 }

 

 







扫描二维码关注公众号,回复: 239441 查看本文章

 

猜你喜欢

转载自ballenlee.iteye.com/blog/2388031