spring源码之AOP下篇

Posted lucas2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring源码之AOP下篇相关的知识,希望对你有一定的参考价值。

 

前言

上篇介绍了一些AOP的基础知识,本篇来说一下spring aop的源码分析。初读AOP时,茫然的是不知道从哪里开始,可能是当初对IOC的理解不够深刻。后面发现其实AOP的入口和IOC一样,也是从两个方法开始。一个是AbstractApplicationContext的fresh方法调用obtainFreshBeanFactory方法去读取配置文件进行初始化操作,另一个就是我的getBean方法了。

概述

在读IOC的时候,我们知道IOC分为两个过程:初始化和依赖注入,那么AOP就是在这两种过程加了特殊处理。

  • 在初始化加载Bean定义时加了特殊处理
  • 在依赖注入时加了特殊处理

初始化加载Bean定义时的特殊处理

我们在IOC中分析知道,在fresh方法中调用obtainFreshBeanFactory方法,一步步跟进去,最终会把XML的配置信息解析成一个个BeanDefinition对象并注册到DefaultListableBeanFactory上。在DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法中把对定义信息的解析分为了默认元素解析和用户元素解析。AOP的话,走的就是用户元素解析的分支。下面我们以这个为起点,进行分析。

  • root标签是默认命名空间下的,而<aop:conf>标签不是,则会走parseCustomElement方法进行解析
//DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法
//默认命名空间下的标签走默认标签解析的方法(比如<bean>),用户标签走用户标签解析的方法(比如<aop:conf>)
//这里走用户定义的解析方式

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);
    }
}
  • 111

Spring中的配置

在spring使用AOP时,我们一般使用两种方式:注解方式和XML配置方式

  • XML方式

  

  • 注解方式

  

总结

  • spring中对AspectJ提供了支持,这块没有去研究过
  • 这篇只是对一些基础概念和常用的两种使用方式进行说明,下篇深入到spring aop的源码

参考链接

  • https://wenku.baidu.com/view/6ce3121da300a6c30c229f89.html(核心关注点与横切关注点)
  • https://www.cnblogs.com/syf/archive/2012/05/09/2491780.html(OOP与AOP)
  • https://blog.csdn.net/garfielder007/article/details/78057107(连接点用地概念)
  • https://docs.spring.io/spring/docs/4.3.18.RELEASE/spring-framework-reference(spring官方文档)

 




以上是关于spring源码之AOP下篇的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码高级笔记之——Spring AOP应用

Spring源码分析之AOP

spring源码之bean加载(bean解析下篇)

详细介绍spring框架(下篇)

Spring源码窥探之:注解方式的AOP原理

Spring读源码系列之AOP--08--aop执行完整源码流程之自动代理创建器导入的两种方式