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下篇的主要内容,如果未能解决你的问题,请参考以下文章