IoC
IoC,Inversion of Control,控制反转。可理解为原来要用到的bean需要自己创建,也就是说控制bean的创建过程。而引入IoC技术后,bean并不由使用者创建,创建的控制权转移到IoC容器
DI
DI,Dependency Injection,依赖注入。更强调bean之间依赖关系的处理。实际上IoC容器在创建bean期间,必然要处理bean之间的依赖关系
IoC Service Provider
IoC容器的抽象概念,负责业务对象的构建管理和业务对象间的依赖绑定。Spring IoC容器的核心部分就是一个IoC Service Provider
IoC Service Provider实际功能示意图
Spring IoC容器的实现
BeanFactory
只实现最核心的IoC Service Provider部分。bean在需要使用时创建。ApplicationContext
以BeanFactory
为基础,增加更多外围服务。启动即创建所有bean。
Spring IoC容器功能实现的各个阶段
容器启动阶段
容器启动触发
- 加载Configuration Metadata,如XML、注解等。一般需要用到
BeanDefinitionReader
- 将配置信息映射为
BeanDefinition
,并注册到BeanDefinitionRegistry
- 调用已注册到容器中的
BeanFactoryPostProcessor
,对BeanDefinition
做额外的操作。例如PropertyPlaceholderConfigurer
处理BeanDefinition
中的占位符。又如CustomEditorConfigurer
注册更多的Bean到容器中,相当于增加了BeanDefinition
Bean实例化阶段
第一次真正获取容器中的某个bean时触发
- 选定实例化bean策略实现。例如
CglibSubclassingInstantiationStrategy
通过CGLIB生成目标类的子类,并使用反射实例化对象。 - 根据实例化bean策略和
BeanDefinition
,创建对应的bean,并包装为BeanWrapper
- 通过
BeanWrapper
辅助设置对象属性 Aware
接口依赖注入处理。如实现了ApplicationContextAware
,会将ApplicationContext
实例注入到bean中。实际上是通过BeanPostProcessor
实现的,调用了ApplicationContextAwareProcessor
的postProcessBeforeInitialization
方法- 调用已注册到容器中的
BeanPostProcessor
的postProcessBeforeInitialization
方法,对bean作额外的操作 - 如果bean实现了
InitializingBean
接口,则调用afterPropertiesSet
方法,对bean作额外的操作 - 如果bean配置了init-method,则调用该方法。这相当于低侵入性的步骤6
- 调用已注册到容器中的
BeanPostProcessor
的postProcessAfterInitialization
方法,对bean作额外的操作 - 如果bean实现了
DisposableBean
接口,则注册一个用于对象销毁的回调,回调调用bean实现接口的destroy
方法 - 如果bean配置了destroy-method,则注册一个用于对象销毁的回调,回调调用该方法。这相当于低侵入性的步骤9
PREVIOUS单元测试简介
NEXTJava四种引用类型