Spring源码【一】:IOC容器的实现
Spring IOC容器的实现
Spring容器可以理解为水桶,里面bean就是水,水桶有普通水桶(beanFactory)、豪华水桶(ApplicationContext),水来自地下(文件),海(jar)甚至是冰(网络),Spring IOC就是一个装水的过程:
-
找水的过程(定位)
-
将不同形态的水统一处理成容器存放的水(加载)
-
将水装入水桶中(注册)
几点说明:
-
在spring里面对资源的抽象都是Resource,但是来源不同即有不同的Resource,比如这里用的ClassPathResource(来自地下)。
-
这里用到的容器是DefaultListableBeanFactory
-
那怎么把资源加载到这个容器中那?找一个打工仔(委托模式)XmlBeanDefinitionReader,完成不同形态的水的统一处理。
-
spring容器最终装的水就是beanDefinition。
后续源码学习全部通过以下案例:
定位
ClassPathXmlApplicationContext
调用子类AbstractApplicationContext的refresh方法
这里又调用了子类AbstractRefreshableApplicationContext的refreshBeanFactory方法:
重点看loadBeanDefinitions方法
这个又是一个需要子类继承的方法,所以这里子类AbstractXmlApplicationContext实现了loadBeanDefinitions方法
loadBeanDefinitions方法:从这里开始已经开始使用打工仔模式了,调用XmlBeanDefinitionReader的loadBeanDefinition方法
这里标黄色的是核心方法,是一个模板设计模式,用来让子类实现。
进入XmlBeanDefinitionReader的loadBeanDefinitions方法
这里非常重要的方法:doLoadBeanDefinitions方法
进入BeanDefinitionDocumentReader的registerBeanDefinitions方法
这里又创建了打工仔BeanDefinitionParserDelegate,用作element解析bd
重点看parseBeanDefinitions方法: