spring容器启动过程
1、AbstractApplicationContext的prepareRefresh()方法调用。
2、XmlBeanDefinitionReader的loadBeanDifinitions(BeanDefinitionRegistry)方法调用。加载spring配置文件,加载完成之后回调BeanDefinitionRegistry的preInstantiateSingletons()方法,这个方法由DefaultListableBeanFactory类实现。
3、AbstractApplicationContext的obtainFreshBeanFactory()方法调用。
4、DefaultListableBeanFactory的preInstantiateSingletons()方法调用。为所有xml文件中定义(以及采用标注方式定义)的bean建立实例。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3、注册Bean后处理器:根据反射机制从BeanDefinitionRegistry中找出所有BeanPostProcessor类型的Bean,并将它们注册到容器的BeanPostProcessor的注册表中;
AbstractApplicationContext中的代码如下:
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
String[] processorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
}
4、初始化消息源:初始化容器的国际化信息资源;
AbstractApplicationContext中的代码如下:
protected void initMessageSource() {
//补充
}
5、初始化应用上下文事件广播器;(观察者模式中的具体主题角色,持有观察者角色的集合,称为注册表)。
AbstractApplicationContext拥有一个applicationEventMulticaster成员变量,applicationEventMulticaster提供了容器监听器的注册表,称其为事件广播器。在第七步中将会将事件监听器装入其中。
AbstractApplicationContext中的代码如下:
private ApplicationEventMulticaster applicationEventMulticaster;
protected void initApplicationEventMulticaster() {
//"applicaitonEventMulticaster",先看配置文件中有无配置该类型。
if (containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this.applicationEventMulticaster = (ApplicationEventMulticaster) getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
} else {
//若没有,则应用Spring框架提供的事件广播器实例
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster();
}
}
public boolean containsLocalBean(String name) {
return getBeanFactory().containsLocalBean(name);
}
public Object getBean(String name, Class requiredType) throws BeansException {
return getBeanFactory().getBean(name, requiredType);
}
Spring初始化事件广播器,用户可以在配置文件中为容器定义一个自定义的事件广播器(bean的名称要为"applicaitonEventMulticaster"),只要实现ApplicationEventMulticaster就可以了,Spring在此会根据beanfactory自动获取。如果没有找到外部配置的事件广播器,Spring使用SimpleApplicationEventMulticaster作为事件广播器。
6、初始化其他特殊Bean:这是一个钩子方法,子类可以借助这个钩子方法执行一些特殊的操作:如AbstractRefreshableWebApplicationContext就使用该钩子方法执行初始化ThemeSource操作;
protected void onRefresh() throws BeansException {
}
7、注册事件监听器(观察者模式中的观察者角色)
Spring根据上下文持有的beanfactory对象(默认是DefaultListableBeanFactory对象),从它的BeanDefinitionRegistry中找出所有实现ApplicationListener的bean,将BeanDefinition对象生成bean,注册为容器的事件监听器,实际的操作就是将其添加到事件广播器所提供的监听器注册表中。
AbstractApplicationContext中的代码如下:
private List<ApplicationListener> applicationListeners = new ArrayList<ApplicationListener>();
public List<ApplicationListener> getApplicationListeners() {
return this.applicationListeners;
}
protected void registerListeners() {
for (Iterator<ApplicationListener> it=getApplicationListeners().iterator(); it.hasNext();) {
addListener((ApplicationListener) it.next());
}
//获取ApplicationListener类型的所有bean,即事件监听器
Collection<ApplicationListener> listenerBeans = getBeansOfType(ApplicationListener.class, true, false).values;
for (Iterator<ApplicationListener> it=listenerBeans.iterator(); it.hasNext();) {
addListener((ApplicationListener)it.next());
}
}
public Map getBeansOfType(Class type, boolean includePrototypes, boolean allowEageInit) throws BeansException {
return getBeanFactory().getBeansOfType(type, includePrototypes, allowEagerInit);
}
protected void addListener(ApplicationListener listener) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
8、初始化singleton的Bean:实例化所有singleton的Bean,并将它们放入Spring容器的缓存中(DefaultListableBeanFactory,它实现了BeanDefinitionRegistry),这就是和直接在应用中使用BeanFactory的区别之处,在创建ApplicationContext对象时,不仅创建了一个BeanFactory对象,并且还应用它实例化所有单实例的bean。
AbstractApplicationContext中的代码如下:
beanFactory.preInstantiateSingletons();
spring容器启动过程的更多相关文章
- spring容器启动过程理解
一.一切从手动启动IoC容器开始 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultLi ...
- 转:spring的启动过程-spring和springMVC父子容器的原理
要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程. s ...
- Spring源码解析-Web容器启动过程
Web容器启动过程,主要讲解Servlet和Spring容器结合的内容. 流程图如下: Web容器启动的Root Context是有ContextLoaderListener,一般使用spring,都 ...
- spring的启动过程就是创建ioc容器的过程
1. spring简介 spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合.高内聚.还提供像通用日志记录.性能统计.安全控制.异常处理等面向切面的能力,还能帮我们管理最头疼 ...
- Spring源码分析专题 —— IOC容器启动过程(上篇)
声明 1.建议先阅读<Spring源码分析专题 -- 阅读指引> 2.强烈建议阅读过程中要参照调用过程图,每篇都有其对应的调用过程图 3.写文不易,转载请标明出处 前言 关于 IOC 容器 ...
- Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动
之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...
- Spring MVC启动过程(1):ContextLoaderListener初始化
此文来自https://my.oschina.net/pkpk1234/blog/61971 (写的特别好)故引来借鉴 Spring MVC启动过程 以Tomcat为例,想在Web容器中使用Spirn ...
- 【Spring】简述@Configuration配置类注册BeanDefinition到Spring容器的过程
概述 本文以SpringBoot应用为基础,尝试分析基于注解@Configuration的配置类是如何向Spring容器注册BeanDefinition的过程 其中主要分析了 Configuratio ...
- Spring Boot启动过程(七):Connector初始化
Connector实例的创建已经在Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动中提到了: Connector是LifecycleMBeanBase的子类,先是设置L ...
随机推荐
- yii遍历行下的每列数据(小1月考)
效果图: 控制器(1种): //显示列表 public function actionList() { //实例化对象 $model= new Qiu(); ...
- windows下nginx和php环境的配置
至于php的配置,与之前博文中使用apache服务器时一样. 对于nginx的配置,来看看如何修改配置文件: #user nobody; worker_processes ; #error_log l ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON OverpaintRegion1
zw版[转发·台湾nvp系列Delphi例程]HALCON OverpaintRegion1 unit Unit1;interfaceuses Windows, Messages, SysUtils, ...
- Mysql子查询、关联查询
mysql中update.delete.install尽量不要使用子查询 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).orde ...
- GLSL第一个程序
拿出来直接运行即可,可以直接理解什么是GLSL,之所以贴出来是因为很多文章写得乱七八糟,一面解释,一面贴代码,有必要吗??很多GLSL电子书都有很详细的解释的. 我的OpenGL框架代码可能和你的框架 ...
- Jquery Ajax调用aspx页面方法 (转载)
在asp.net webform开发中,用jQuery ajax传值一般有几种玩法 1)普通玩法:通过一般处理程序ashx进行处理: 2)高级玩法:通过aspx.cs中的静态方法+WebMethod进 ...
- ApkDec android反编译工具
转自:http://www.newasp.net/soft/70498.html 下载 ApkDec是一款免费的绿色APK反编译工具 forandroid ,由android开发者社区开发. ApkD ...
- python随机数的使用记录
一.random模块简介 Python标准库中的random函数,可以生成随机浮点数.整数.字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等. 二.random模块重要函数 1 ).ra ...
- 【python cookbook】【数据结构与算法】16.筛选序列中的元素
问题:提取出序列中的值或者根据某些标准对序列做删减 解决方案:列表推导式.生成器表达式.使用内建的filter()函数 1.列表推导式方法:存在一个潜在的缺点,如果输入数据非常大可能会产生一个庞大的结 ...
- win10 python nltk安装
主要是参照http://www.tuicool.com/articles/VFf6Bza