Spring源码深度解析-第6章《容器的功能扩展》总结

1、ClassPathXMLApplicationContext初始化的步骤

1)初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证;

2)初始化BeanFactory,并进行XML文件读取;

3)对beanFactory进行各种功能填充;

4)子类覆盖方法做额外的处理;

5)激活各种BeanFactory处理器;

6)注册拦截bean创建的bean处理器;

7)为上下文初始化Message源;

8)初始化应用消息广播器;

9)留给子类来初始化其他的bean;

10)在所有注册的bean中查找listener bean,注册到消息广播器中;

11)初始化剩下的单实例(非惰性的);

12)完成刷新过程。

2、环境准备prepareRefresh

1)initPropertySource正符合Spring的开放式结构设计,给用户最大扩展Spring的能力;

2)validateRequiredProperties则是对属性进行验证。

3、加载BeanFactory

  • obtainFreshBeanFactory步骤:

1)创建DefaultListableBeanFactory;

2)指定序列化ID;

3)定制FactoryBean;

4)加载BeanDefinition;

‘5)使用全局变量记录BeanFac

4、功能扩展

  • 增加SPEL语言的支持
  • 增加属性注册编辑器
  • 添加ApplicationContextAwareProcessor处理器
  • 设置忽略依赖
  • 注册依赖

5、BeanFactory的后处理

  • BeanPostProcessor和BeanFactoryPostProcessor:如果你想改变实际的bean实例,那么你最好使用BeanPostProcessor。同样的,BeanFactoryPostProcessor的作用范围是容器级的。
  • PropertyPlaceholderConfigurer:PropertyPlaceholderConfigurer间接继承了BeanFactoryPostProssor接口,当Spring加载任何实现了这个接口的bean的配置时,都会在bean工厂载入所有bean的配置之后执行postProcessBeanFactory方法。正是通过事项BeanFactoryPostProcessor接口,BeanFactory会在实例化任何bean之前获得配置信息,从而能够正确解析bean描述文件中的变量引用。
  • 激活BeanFactoryPostProcessor:从上面的方法我们可以看到,对于BeanFactoryPostProcessor的处理主要分为两种情况进行,一个是对于BeanDefinitionRegistry类的特殊处理,另一种是对普通的BeanFactoryPostProcessor进行处理。

对于BeanDefinitionRegistry类型的处理类的处理主要包括以下内容:

1)对于硬编码注册的后处理器的处理,主要是通过AbstractApplicationContext中的添加处理器方法addBeanFactoryPostProcessor进行添加;

2)记录后的处理器主要使用3个Lis完成:

a.registryPostProcessors:记录通过硬编码方式注册的BeanDefinitionRegistryPostProcessor类型的处理器;

b.regularPostProcessors:记录通过硬编码方式注册的BeanFactoryPostProcessor类型的处理器;

c.registryPostProcessorBeans:记录通过配置方式注册的BeanDefinitionRegistryPostProcessor类型的处理器。

3)对以上记录的List中的后处理器进行统一调用BeanFactoryPostProcessor的postProcessorBeanFactry方法;

4)对BeanFactoryPostProcessor中非BeanDefinitionRegisrtyPostProcessor类型的后处理器进行统一的BeanFactoryPostProcessor的postProcessorBeanFactory进行调用;

5)普通BeanFactory的处理。

  • 注册BeanPostProcessor:

ApplicationContext中添加了自动注册的功能,这个特性是在registerBeanPostProcessor方法中完成的:

1)注册实现所有的PriorityOrdered的BeanPostProcessor;

2)注册实现所有实现Ordered的BeanPostProcessor;

3)注册所有无序的BeanPostProcessor;

4)注册所有MergedBeanDefinitionPostProcessor类型的BeanPostProcessor。

对于BeanFactoryPostProcessor的处理要区分两种情况,一种方式是通过硬编码方式的处理,另一种是通过配置文件方式的处理;而BeanPostProcessor的处理中只考虑了配置文件的方式。因为对于BeanFactoryPostProcessor的处理,不但要实现注册功能,而且还要实现对后处理器的激活操作,所以需要载入配置中的定义,并进行激活;而对于BeanPostProcessor并不需要马上调用,硬编码的方式实现的功能是将后处理器提取并调用。

6、初始化非延迟加载单例

完成BeanFactory的初始化工作,其中包括ConversionService的设置、配置冻结以及费延迟加载的bean的初始化工作。

1)ConversionService的设置:之前我们提到过使用自定义类型转换器从String转换为Date的方式,那么在Spring中还提供了另一种转换方式:使用Converter;

2)冻结配置:冻结所有的bean定义,说明注册的bean定义将不被修改或进行任何进一步的处理;

3)初始化非延迟加载:ApplicationContext实现的默认行为就是在启动时将所有单例bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的单例bean。

7、finishRefresh

在Spring中还提供了Lifecycle接口,LifeCycle中包含了strat/stop方法,实现此接口后Spring会保证在启动的时候调用其start方法开始生命周期,并在Spring关闭的时候调用stop方法来结束生命周期,通常用来配置后台程序,在启动后一直运行(如对MQ进行轮询等):

1)initLifecycleProcessor:当ApplicationContext启动或停止时,它会通过LifecycleProcessor来与所有声明的bean的周期做状态更新,而在LifecycleProcessor的使用前首先需要初始化;

2)onRefresh:启动所有实现了Lifecycle接口的bean;

3)publishEvent:当完成ApplicationContext初始化的时候,要通过Spring中的事件发布机制来发出ContextRefreshedEvent事件,以保证对应的监听器可以做进一步的逻辑处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值