IoC容器,系统需要某个bean,IoC容器就会把对应的实例丢给你,至于这个bean是否依赖其他组建,怎么完成初始化,系统并不关心。因为Ioc容器已经帮你这部分信息给完成了。
IoC容器如何管理各个业务对象以及他们之间的依赖关系的,是通过哪种途径来记录和管理Bean信息的?
BeanDefinition
对象实例会保存bean对象的必要信息(比如对应的class类型,是否是抽象类,构造方法和参数等)。容器中的每一个bean都会有一个对象的 BeanDefinition
实例。
当客户端向容器请求相应对象时,容器就会通过这些信息为客户端返回一个完整可用的bean实例。
Spring IoC容器的工作流程
(1)容器启动阶段
容器启动时,会加载配置元数据(Configuration MetaData)信息,然后依赖部分工具类,比如: BeanDefinitionReader
,去对加载Configuration MetaData进行解析和分析,并将分析后的信息组装为相应的 BeanDefinition
,最后把这些保存了bean定义的 BeanDefinition
,注册到响应的 BeanDefinitionRegistry
,这样容器的启动工作就完成了。
这个阶段主要侧重于对Bean对象管理信息的收集。
(2)Bean实例化阶段
当有一个请求通过容器中 getBean()
去获取对象,或者因为依赖关系需要隐式调用 getBean()
时,就会触发该阶段。容器检查请求的对象之前是否已经实例化。
如果没有实例化,就会根据 BeanDefinition
所提供的信息实例化被请求的对象,并为其注入依赖。
当对象装配完毕,容器就会立即将其返回给请求方法使用。
两种容器实例化Bean。
BeanFactory:懒加载,当请求方法调用到bean时,才会对这个bean对象进行初始化和依赖注入。
ApplicationContext:管理的bean,会在容器启动时,就全部完成初始化和依赖注入。