Spring容器加载过程分析
IOC类图结构各个接口的作用接口名说明BeanFactory定义了基本IOC容器的规范,包含像getBean()这样的IOC容器的基本方法HierarchicalBeanFactory增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲IOC接口的关联功能ConfigurableBeanFactory主要定义了...
IOC类图结构
各个接口的作用
接口名 | 说明 |
---|---|
BeanFactory | 定义了基本IOC容器的规范,包含像getBean()这样的IOC容器的基本方法 |
HierarchicalBeanFactory | 增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲IOC接口的关联功能 |
ConfigurableBeanFactory | 主要定义了对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean后置处理器,等等。 |
AutowireCapableFactory | 这个工厂接口继承自BeanFacotory,它扩展了自动装配的功能,根据类定义BeanDefinition装配Bean、执行前、后处理器等 |
ListableBeanFactory | 可以列出工厂可以生产的所有实例。当然,工厂并没有直接提供返回所有实例的方法 |
MessageSource | 提供国际化的消息访问 |
ResourceLoader | 资源加载的功能 |
ApplicationContext | 核心接口 |
ApplicationEventPublisher | 功能就是发布事件,也就是把某个事件告诉的所有与这个事件相关的监听器 |
ConfigurableApplicationContext | 提供设置活动和默认配置文件以及操作底层属性源的工具 |
WebApplicationContext | 提供了Web环境的支持 |
ThemeSource | 主题资源 |
BeanFactory和ApplicationContext的区别
BeanFactory是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。
ApplicationContext接口是由BeanFactory接口派生而来,因而具有BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能
1.MessageSource, 提供国际化的消息访问
2.资源访问,如URL和文件
3.事件传播
4.载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
Spring的启动流程
Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
1.1 xml注册bean;
1.2 注解注册Bean;@Service、@Component、@Bean、xxx
Spring容器会合适的时机创建这些Bean
2.1用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
2.2统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
后置处理器;BeanPostProcessor
每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
事件驱动模型;
ApplicationListener;事件监听;
ApplicationEventMulticaster;事件派发:
参数 | 值 |
---|---|
configLocation· | applicationContext.xml |
parent | null |
refresh | true |
setConfigLocations(configLocations)
1.setConfigLocations主要工作有两个:创建环境对象ConfigurableEnvironment 、处理ClassPathXmlApplicationContext传入的字符串中的占位符;
2. 环境对象ConfigurableEnvironment中包含了当前JVM的profile配置信息、环境变量、 Java进程变量;
3. 处理占位符的关键是ConfigurableEnvironment、PropertyResolver、PropertyPlaceholderHelper之间的配合
refresh()
@Override
public void refresh() throws BeansException, IllegalStateException {
//startupShutdownMonitor对象在spring环境刷新和销毁的时候都会用到,确保刷新和销毁不会同时执行
synchronized (this.startupShutdownMonitor) {
// 准备工作,例如记录事件,设置标志,检查环境变量等,并有留给子类扩展的位置,用来将属性加入到applicationContext中
prepareRefresh();
// 创建beanFactory,这个对象作为applicationContext的成员变量,可以被applicationContext拿来用,
// 并且解析资源(例如xml文件),取得bean的定义,放在beanFactory中
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对beanFactory做一些设置,例如类加载器、spel解析器、指定bean的某些类型的成员变量对应某些对象等
prepareBeanFactory(beanFactory);
try {
// 子类扩展用,可以设置bean的后置处理器(bean在实例化之后这些后置处理器会执行)
postProcessBeanFactory(beanFactory);
// 执行beanFactory后置处理器(有别于bean后置处理器处理bean实例,beanFactory后置处理器处理bean定义)
invokeBeanFactoryPostProcessors(beanFactory);
// 将所有的bean的后置处理器排好序,但不会马上用,bean实例化之后会用到
registerBeanPostProcessors(beanFactory);
// 初始化国际化服务
initMessageSource();
// 创建事件广播器
initApplicationEventMulticaster();
// 空方法,留给子类自己实现的,在实例化bean之前做一些ApplicationContext相关的操作
onRefresh();
// 注册一部分特殊的事件监听器,剩下的只是准备好名字,留待bean实例化完成后再注册
registerListeners();
// 单例模式的bean的实例化、成员变量注入、初始化等工作都在此完成
finishBeanFactoryInitialization(beanFactory);
// applicationContext刷新完成后的处理,例如生命周期监听器的回调,广播通知等
finishRefresh();
}
catch (BeansException ex) {
logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);
// 刷新失败后的处理,主要是将一些保存环境信息的集合做清理
destroyBeans();
// applicationContext是否已经激活的标志,设置为false
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}
更多推荐
所有评论(0)