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容器启动过程的更多相关文章

  1. spring容器启动过程理解

    一.一切从手动启动IoC容器开始 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultLi ...

  2. 转:spring的启动过程-spring和springMVC父子容器的原理

    要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的.spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程. s ...

  3. Spring源码解析-Web容器启动过程

    Web容器启动过程,主要讲解Servlet和Spring容器结合的内容. 流程图如下: Web容器启动的Root Context是有ContextLoaderListener,一般使用spring,都 ...

  4. spring的启动过程就是创建ioc容器的过程

    1. spring简介 spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合.高内聚.还提供像通用日志记录.性能统计.安全控制.异常处理等面向切面的能力,还能帮我们管理最头疼 ...

  5. Spring源码分析专题 —— IOC容器启动过程(上篇)

    声明 1.建议先阅读<Spring源码分析专题 -- 阅读指引> 2.强烈建议阅读过程中要参照调用过程图,每篇都有其对应的调用过程图 3.写文不易,转载请标明出处 前言 关于 IOC 容器 ...

  6. Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动

    之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...

  7. Spring MVC启动过程(1):ContextLoaderListener初始化

    此文来自https://my.oschina.net/pkpk1234/blog/61971 (写的特别好)故引来借鉴 Spring MVC启动过程 以Tomcat为例,想在Web容器中使用Spirn ...

  8. 【Spring】简述@Configuration配置类注册BeanDefinition到Spring容器的过程

    概述 本文以SpringBoot应用为基础,尝试分析基于注解@Configuration的配置类是如何向Spring容器注册BeanDefinition的过程 其中主要分析了 Configuratio ...

  9. Spring Boot启动过程(七):Connector初始化

    Connector实例的创建已经在Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动中提到了: Connector是LifecycleMBeanBase的子类,先是设置L ...

随机推荐

  1. POJ 2417 Discrete Logging(离散对数-小步大步算法)

    Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 ...

  2. demo16Toast

    /Users/alamps/AndroidStudioProjects/demo16Toast/demo16Toast/src/main/res/layout/activity_main.xml &l ...

  3. jvm笔记

    -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数, ...

  4. 2016-9-6 批量给文件名的前面加上“igeek_高薪就业” 2、 利用FileInputStream和FileOutputStream复制文件

    在此只列出典型题目,有的题目扫一眼就有代码的不去浪费时间了,想要完整题目的评论留邮箱,看到就发.持续更新中... 1.批量给文件名的前面加上“igeek_高薪就业” package com.work; ...

  5. 1. 星际争霸之php面向对象(一)

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. java类的访问权限

    1.解析 Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符. private: Java语言中对访问权限限制的最窄的修 ...

  7. 关于 MySQL LEFT JOIN 你可能需要了解的三点

    即使你认为自己已对 MySQL 的 LEFT JOIN 理解深刻,但我敢打赌,这篇文章肯定能让你学会点东西! ON 子句与 WHERE 子句的不同 一种更好地理解带有 WHERE ... IS NUL ...

  8. 创建laravel项目时打开浏览器常见错误

    1.Whoops, looks like something went wrong. 打开:D:\java\wamp\www\subway\app\config\app.php 修改:'debug' ...

  9. html 关于块级元素和行内元素

    常用的行内元素要记住:a.span.img.input.lable.select.strong.textarea 常用的块级元素要记住:div.h1~h6.dl.ul.ol 例如在一个title中,有 ...

  10. PHP Deprecated: Comments starting with '#' are deprecated in *.ini 警告解决办法

    新装的ubuntu 10.04系统,使用新立得装的PHP,但是每次我在命令行下执行php脚本时都会出如下的警告信息: PHP Deprecated:  Comments starting with ' ...