IoC容器:
IoC容器会以某种方式加载Configuration metadata(通常是xml格式的配置信息),然后根据这些信息绑定整个系统的对象,最后总组装成一个可用的机遇轻量级容器的应用系统。
IoC启动过程:分为两个阶段,一个是容器启动阶段,另外一个是Bean实例化阶段
容器启动阶段:加载配置 -----》 分析配置信息 -----》装备到BeanDefinition -----》其他后处理(PostProcessor)
Bean实例化阶段:实例化阶段 -----》装配阶段 -----》 生命周期回调 ------》 对象其他处理 -----》 注册回调接口
- 容器启动阶段:启动时,首先通过某种途径加载,一段依赖某种工具类(Bean Definition Reader) 对加载的配置进行解析和分析,并将分析后的信息编组为相应的BeanDefinition,最后把这些保存了bean定义必要信息的BeanDefinition。注册到相应的BeanDefinitionRegister。
- Bean实例化阶段:当某个请求方通过容器的getBean方面明确地请求某个对象,就会触发这个阶端。首先检查所请求的对象是否初始化,如果没有则会根据注册的BeanDefinition所提供的信息实例化被请求对象,并为其注册依赖。
干预容器的初始化:
spring提供了一种叫做BeanFactoryPostProcessor的容器扩展机制,在容器启动的第一个阶段增加一个工序。让我们对BeanDefinition做一些额外的操作。比如修改其中的Bean中定义的属性,为Bean定义增加其他信息等。
要自定义BeanFactoryPostProcessor。要实现BeanFactoryProcessor接口,若一个容器中实现了多个BeanFactoryPostProcessor,则还需要实现Ordered接口以指定顺序。
spring已经提供了ProperyPlaceholderConfigurer,PropertyOverrideConfigurer这两个实现类。
properyPlaceholderConfigurer:加载来自properties的信息
propertyOverrideConfigurer:用来自properties覆盖原来在xml中的配置信息。
CustomEditorConfigurer。
spring内部通过JavaBean的property Editor来帮助进行String 类型的其他类型的转换工作
指定propertyEditor:可以通过继承PropertyEditorSupport
容器Bean实例化阶段:
getBean方法第一次被调用时,Bean实例化阶段的活动才会做触发。第二次调用则会直接房峰辉容器缓存的第一次实例化完的对象,若发现未被实例化,则哦能够过createBean()方法来进行对象实例化、
实例化过程:
实例化bean对象 ----->设置对象属性 -----> 检查Aware相关接口并设置相关依赖----->BeanPostProcess前置处理,检查是否是InitializingBean以决定是否调用afterPropertiesSet方法----->检查是否配置有自定义的init-method -----> BeanPostProcessor 后置处理 -----> 注册必要的Destruction相关回调接口 -----> 使用 -----> 是否实现DisposableBean -----> 是否配置有自定义的destory方法