Spring容器概述

参加工作以来,用Spring开发过不少项目。从最早的SpringMVC,到最近的Spring Cloud项目,都在跟Spring打交道,虽然一直有阅读Spring相关的技术文章,但都浅尝辄止,一直没有对Spring底层原理做深入的研究。现在计划从底层原理开始,了解掌握我们的程序在启动到运行过程中Spring都帮我们干了什么(不涉及源码)。这是这个系列的第一篇,梳理介绍Spring Ioc的基本概念、作用等。

Ioc&Di

Ioc应该都知道是控制反转的意思。是指代码中对于依赖的对象不再由自己创建,而是交给其他服务负责,只要确保在运行时拥有依赖对象能正常工作即可。Di-依赖注入,则是实现Ioc的一种方式,或者说一种描述。SpringIoc容器就是通过Di的方式实现Ioc的服务。

SpringIoc容器

SpringIoc容器负责两件事:1、初始化Bean;2、组装依赖。所以原来的开发代码中的new Object()等代码可以清除,把初始化Bean的任务交给容器。那如何把有依赖关系的Bean按照正确关系组织起来呢?Spring通过在容器中记录Bean之间的关系,在需要Bean的时候,通过一系列流程生产出正确的Bean返回。(详细过程后续文章会讨论到,此处先了解大致路径)。系统的运行就是对象间的合作,有了Spring容器,就有了系统运行的基础:提供正确的对象,系统就能正确的运行。

容器分类

Spring容器大体可分为两类:BeanFactoryApplicationContext这两个接口定义了作为一个容器必须提供的功能,具体代码可以参考源码。其中ApplicationContext继承自BeanFactory,并在其基础上,扩展了一些功能。最大的区别是:ApplicationContext类型容器会在启动时创建所有的Bean,而BeanFactory默认是延迟初始化(可自定义配置)。这两个接口Spring都提供了默认实现。我们比较熟悉的就是XmlBeanFactoryXmlWebApplicationContext这两个了。

BeanDefinition & BeanDefinitionRegistry

BeanDefinitionBeanDefinitionRegistry是容器中两个重要的组件。BeanDefinition是记录Bean的定义信息的数据结构。一个Bean到底长什么样子,应该如何初始化,或者说Bean的元数据信息,是由BeanDefinition存储的。这样当容器需要初始化Bean的时候,根据记录其信息的Beandefinition就能正确的创建Bean出来。BeanDefinitionRegistry则是容器内真正存储Bean的地方。我们知道Spring中的Bean默认是单例的,如果有多处需依赖某一个Bean,最终它们得到的是同一个Bean,Bean初始化之后就存储于容器内。负责这部分工作的就是BeanDefinitionRegistry。(容器内存的并不是Bean本身,而是Bean对应的BeanWrapper)

posted @ 2018-08-21 14:37  道_长  阅读(208)  评论(0)    收藏  举报