【Spring】IOC:源码流程的核心类时序图
IOC 容器初始化可以简单的分为三步:定位 Resource => 加载 BeanDefinition => 注册 BeanDefinition
- 【Spring】IOC:初始化源码流程(上)定位 Resource
- 【Spring】IOC:初始化源码流程(中)加载 BeanDefinition
- 【Spring】IOC:初始化源码流程(下)注册 BeanDefinition
初始化过程的简易时序图如下(只列出了核心类):
初始化的入口在容器实现中的refresh()调用来完成。对Bean定义载入IOC 容器使用的方法是loadBeanDefinition(),其中的大致过程如下:
- 通过 ResourceLoader 来完成资源文件位置的定位,DefaultResourceLoader 是默认的实现,同时上下文本身就给出了 ResourceLoader 的实现,可以从类路径,文件系统,URL等方式来定为资源位置。如果是 XmlBeanFactory 作为 IOC容器,那么需要为它指定 Bean定义的资源,也就是说 Bean 定义文件是通过抽象成 Resource 来被 IOC 容器处理的
- 容器通过 BeanDefinition 来完成定义信息的解析和 Bean 信息的注册,往往使用的是 XmlBeanDefinitionReader 来解析 Bean 的XML定义文件 - 实际的处理过程是委托给 BeanDefinitionParserDelegate 来完成的,从而得到bean的定义信息,这些信息在 Spring 中使用 BeanDefinition 对象来表示
- BeanDefinition 可以让我们想到 loadBeanDefinition(), registerBeanDefinition() 这些相关方法。它们都是为处理 BeanDefinitin 服务的,容器解析得到 BeanDefinition 以后,需要把它在 IOC 容器中注册,这由 IOC 实现BeanDefinitionRegistry 接口来实现。注册过程就是在IOC 容器内部维护的一个 HashMap 来保存得到的 BeanDefinition 的过程。这个 HashMap 是 IOC 容器持有Bean信息的场所,以后对Bean的操作都是围绕这个HashMap来实现的。
然后我们就可以通过 BeanFactory 和 ApplicationContext 来享受到Spring IOC的服务了。
在使用IOC容器的时候,我们注意到除了少量粘合代码,绝大多数以正确IOC 风格编写的应用程序代码完全不用关心如何到达工厂,因为容器将把这些对象与容器管理的其他对象钩在一起。基本的策略是把工厂放到已知的地方,最好是放在对预期使用的上下文有意义的地方,以及代码将实际需要访问工厂的地方。 Spring本身提供了对声明式载入web应用程序用法的应用程序上下文,并将其存储在ServletContext中的框架实现。
还没有评论,来说两句吧...