spring aopAOP(面向切面编程)Spring源码分析

Spring源码-AOP(九)-AOP源码分析总结

2017-09-13  本文已影响250人  阿亮私语

前言

至此,AOP相关的源码已经分析结束,接下来我们总结下AOP这块的相关功能,AOP这块的整个分析是从配置文件开始的。这里我们从IOC创建的过程中去分析。
经过之前IOC的分析,我们知道AOP这块也是有bean加载的时候处理的,应该有如下两处。

1、加载bean定义的时候

根据之前IOC的源码分析,我们直接定位到DefaultBeanDefinitionDocumentReader这个类的parseBeanDefinitions方法,如果有不熟悉的,请翻阅之前的定义
【DefaultBeanDefinitionDocumentReader】

    protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
        if (delegate.isDefaultNamespace(root)) {
            NodeList nl = root.getChildNodes();
            for (int i = 0; i < nl.getLength(); i++) {
                Node node = nl.item(i);
                if (node instanceof Element) {
                    Element ele = (Element) node;
                    if (delegate.isDefaultNamespace(ele)) {
                        parseDefaultElement(ele, delegate);
                    }
                    else {
                        delegate.parseCustomElement(ele);
                    }
                }
            }
        }
        else {
            delegate.parseCustomElement(root);
        }
    }

很明显的得知,这里aop不是默认的<bean id = ''>这样的默认Namespace,因此会执行21行的代码
【BeanDefinitionParserDelegate】

public BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {
    String namespaceUri = getNamespaceURI(ele);
    if (namespaceUri == null) {
        return null;
    }
    NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
    if (handler == null) {
        error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
        return null;
    }
    return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}

到这里也就能接着AOP入口之前的分析了,接下来主要分析下相应的AOP加载的流程图。
标签加载时序图


下面是AOP标签的处理过程

2、创建AOP代理


说明:

上一篇下一篇

猜你喜欢

热点阅读