本文以<Spring技术内幕>第二版为基础,按照作者理解,详细阐述Spirng特性原理,如IOC,AOP以及SringMVC等.作者能力有限,只是在自我理解的基础上,去理解Spring,如有不足,希望读者及时评论.
第一部分我们来介绍SpringIOC,对于IOC来说,大家并不陌生,可以这么说IOC是整个Spring的基础,AOP,SpringMVC都依赖于Spring IOC.让我们来解开Spring的神秘面纱,一步一步去探究Spring的奥秘!
“依赖注入,控制反转”这个耳熟能详的词语,大家可能立马联想到SpringIOC,具体来说,IOC容器,把对象依赖关系的管理被反转了,具体被转到了IOC容器中来,对象之间的依赖关系由IOC容器来管理.说道IOC容器,
大家可能想到BeanFactory和ApplicationContext,可这二者之前有什么关系呢?自问自答下,可以这么说,ApplicationContext是在BeanFactory的基础上做的拓展.
整个IOC过程可以分为三步.
1.Resource资源定位
2.BeanDefinition的载入
3.向IOC容器注入BeanDefinition
接下来,让我们利用编程式的方式去看从IOC容器开始,Spring在背后所做的一切.
首先我们定义一个名字叫helloWorld的bean,通过xml配置下.
在上图中,我们声明一个ApplicationContext上下文,这个上下文很明显是Xml文件形式的上下文,当然上下文不止这一种,我们用大家最熟悉的一种来进行解析FileSystemXmlApplicationContext.
我们看下FileSystemXmlApplicationContext,发现refresh()方法,而这个方法,就是标志的IOC容器的正式开始.
在refresh()方法中我们关注obtainFreshBeanFactory()方法,这个方法是子类启动refreshFactory的地方.
PS:其实我们在Sping源码中,很多方法我们都可以根据方法的名字来大致猜出这个函数是干什么的.这也是阿里的java规范中所推崇的,尽量的”顾名思义”.
在refreshFactory中,首先会判断之前是否存在这个IOC容器,如果存在,就会销毁关闭,然后会重新创建IOC容器,也就是BeanFactory.
通过createFactory创建一个IOC容器,而在createBeanFactory()中,会对Resource进行解析,这个Resource对象就是对我们配置文件的封装,本文中的Resource显然就是xml配置文件中的Bean
接下来,进行序列化,会加载定制的BeanFactory方法.最后启动对BeanDefinition的载入.这里就是IOC的第二步的开始.
PS:BeanDefinition是POJO对象在IOC容器中的抽象,通过这个BeanDefinition,IOC容器对Bean进行管理,也就是说Bean被包装成BeanDefinition,被IOC容器进行管理.
对于BeanDefinition的加载,首先我们会声明一个BeanDefinitionReader,为它设置一系列的环境参数,初始化后,就会对它进行加载
.
我们会发现reader会根据configResource的来源不同,进行配置文件的资源加载.如果Resource为空,就会停止对整个BeanDefinition的载入,否则就会遍历整个Resource集合包含的BeanDefinition的信息.
实现BeanDefinition在IOC中的注册