Spring容器内部工作机制

2016-12-26  本文已影响66人  忘净空

Spring启动时执行的操作

AbstractApplicationContext是ApplicationContext的抽象实现类,它的refresh方法定义了Spring启动时执行的操作。

AbstractApplicationContext中refresh()方法源码片段

使用设计模式的模版模式
//初始化BeanFacoty
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);

// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);

// 调用后工厂后置处理器
invokeBeanFactoryPostProcessors(beanFactory);

// 注册Bean后置处理器
registerBeanPostProcessors(beanFactory);

// 初始化消息源
initMessageSource();

// 初始化容器事件广播器
initApplicationEventMulticaster();

// 初始化其他特殊的Bean,这是个钩子方法,子类中具体实现
onRefresh();

// 注册事件监听器
registerListeners();

// 初始化所有单例的Bean
finishBeanFactoryInitialization(beanFactory);

//完成刷新并发布容器刷新事件
finishRefresh();

Spring启动时执行的操作图
  1. ResourceLoader从存储介质中加载spring配置信息,并使用Resource标识这个配置文件的资源。

  2. BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件,配置文件中的每一个<bean>被解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。

  3. 容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理器的Bean,然后调用这些Bean工厂处理器对BeanDefinfitionRegistry中的BeanDefinition进行加工处理,主要完成两项工作:

(1)对使用到占位符的<bean>元素标签进行解析,得到最终的配置项,这意味着一些半成品额BeanDefinition对象加工处理并得到完整的BeanDefinition对象。

(2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean,并自动将他们注册到Spring容器的属性编辑器注册表中。

  1. Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化的工作。

  2. 在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合Bean的BeanDefinition以及容器中的属性编辑器,完成Bean属性的设置工作。

  3. 利用容器中注册的Bean后处理器对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。

上一篇下一篇

猜你喜欢

热点阅读