SpringMVC IOC容器初始化

首先强调一下SpringMVC IOC容器初始化有些特别,在SpringMVC中除了生成一个全局的spring Ioc容器外,还会为DispatcherServlet生成一个容器,具体的下一篇有讲述。

我们知道spring中单纯使用main函数就可以生成一个容器,如下:

public class MainTest {
public static void main(String[] args){
ApplicationContext appContext = new ClassPathXmlApplicationContext("cjj/models/beans.xml");
Person p = (Person)appContext.getBean("person");
}
}

以前专门写过一篇spring Ioc容器初始化过程的文章 《Spring IoC容器初始化过程学习》,感兴趣可以看看。该文中注意介绍了Spring IOC容器初始化过程一般需要三个步骤,

  1. Resource定位(Bean的定义文件定位)
  2. 将Resource定位好的资源载入到BeanDefinition
  3. 将BeanDefiniton注册到容器中

那篇文章中强调的是bean的加载过程,也是核心过程,这个过程可查阅源代码中的obtainFreshBeanFactory过程 ,该过程中会执行refreshBeanFactory会创建一个beanFactory实例(默认类型为DefaultListableBeanFactory),以及loadBeanDefinitions(defaultListableBeanFactory)。

但是spring容器初始化的过程远远 不止文中介绍的那么多,还有一个重要的refresh方法需要进行补充。那么本文可以结合web.xml配置加载来简单的阐述refresh方法执行力那些逻辑。

如果你不太了解应用启动时容器初始化web.xml的作用,建议先看一下之前的文章《springmvc web.xml配置之ContextLoaderListener》,该文中介绍了Spring中ContextLoaderListener的作用,知道ContextLoaderListener首先会常见一个XmlWebApplicationContext类型的IOC容器,然后读取配置文件信息进行初始化,如果没有写,那就默认为/WEB-INF/applicationContext.xml,可以查阅源码:

public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";
public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";
public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";
...(略)

一般会在web.xml配置,如下:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationcontext-*.xml</param-value>
</context-param>

例如像上面这么配置的话,XmlWebApplicationContext容器就会将applicationcontext-*.xml配置文件中的信息读取到,然后调用refresh()方法,由于XmlWebApplicationContext implements于ConfigurableApplicationContext,也就是实现了ConfigurableApplicationContext.refresh()方法,该方法会将这些配置信息加载到IOC容器中。

具体的,XmlWebApplicationContext继承于AbstractApplicationContext,它实现了ConfigurableApplicationContext接口中的refresh方法:

public void refresh() throws BeansException, IllegalStateException {
Object var1 = this.startupShutdownMonitor;
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory); try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var9) {
if(this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
} this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
} }
}

  

  • prepareRefresh()

准备工作,一是设置spring启动事件,开启活跃状态;二是初始化属性源信息;三是验证必要属性。

  • obtainFreshBeanFactory()

创建beanFactory(过程是根据xml为每个bean生成BeanDefinition并注册到生成的beanFactory)

  • prepareBeanFactory(beanFactory)

注册bean等。

  • postProcessBeanFactory(beanFactory)

继上一步beanfactory设置之后进行后续操作

  • invokeBeanFactoryPostProcessors(beanFactory)

  • registerBeanPostProcessors(beanFactory)

例化和注册beanFactory中扩展了BeanPostProcessor的bean

  • initMessageSource()

初始化国际化属性。

  • initApplicationEventMulticaster

初始化事件广播器,用于发布事件。

  • onRefresh()

设置样式工具ThemeSource

  • registerListeners()
  • finishBeanFactoryInitialization(beanFactory)
  • finishRefresh()

更多具体细节可以參考: https://www.cnblogs.com/lkdirk/p/7145941.html 。

springmvc web.xml配置之 -- SpringMVC IOC容器初始化的更多相关文章

  1. SpringMvc web.xml配置详情

    出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...

  2. springmvc web.xml配置之 -- DispatcherServlet

    springMVC servlet配置与启动 看一下springmvc的web.xml常见配置: <servlet> <!-- 配置DispatcherServlet --> ...

  3. springmvc web.xml配置之 -- ContextLoaderListener

    首先回归一下web.xml的常用配置,看一个示例: <context-param> <param-name>contextConfigLocation</param-na ...

  4. Java web.xml 配置技巧—动态欢迎页地址

    我们的 Java   Web  项目在配置web.xml 欢迎页地址默认是index.html .index.jsp ,不知道有人注意过没有,如果我要配置成/index/user.action  或者 ...

  5. springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置

    前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...

  6. springmvc学习指南 之---第27篇 spring如何实现servlet3.0无web.xml 配置servlet对象的

    writedby 张艳涛 基于web.xml配置,有人说麻烦,tomcat给按照servlet3.0,实现了基于注解@WebServlet,有人说springmvc的springmvc.xml配置麻烦 ...

  7. springMVC WebApplicationInitializer 替代web.xml 配置Servlet 之原理

    Servlet 3.0之前 ,xml  配置 在过去搭建spring + springMCV ,首先第一步要做的是什么 ,就是要配置web.xml 文件 ,把springMVC 中的Servlet 加 ...

  8. Maven-SSM项目pom.xml配置以及springmvc配置以及mybatis配置及web.xml配置

    一.Maven本地仓库的pom.xml配置 (全部是mysql数据库) <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  9. Spring 及 SpringMVC的web.xml配置详解

    出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...

随机推荐

  1. WIN8.1 PRO RTM VOL.Enterprise.2013.10.17

    Windows 8.1 Pro VL (x64) - DVD (Chinese-Simplified)ISO|Chinese - Simplified|发布日期: 2013/10/17文件名: cn_ ...

  2. Visio2010建立ER图并直接导出为SQL语句

    Visio2010建立ER图并直接导出为SQL语句 2013年08月20日 ⁄ 综合 ⁄ 共 2581字 ⁄ 字号 小 中 大 ⁄ 评论关闭 建立数据库时我们需要考虑数据之间的关系,为了理清数据之间的 ...

  3. sublime text2下配置c++

    今天安装了sublime text2,真是编辑神器,不再用notepad了. 笔记本上没有c++运行环境,用编辑器既轻巧,又方便,VS太臃肿了. 要在sublime text2 下运行c++程序,需要 ...

  4. 【java基础】java字符串之StringBuffer和StringBuilder

    [一]简述区别 package com.sxf.test.string; public class StringBufferStringBuilderTest { public static void ...

  5. vue使用百度编辑器ueditor踩坑记录

    一.使用 下载放入项目 main.js引入 import '../static/UE/ueditor.config.js'; import '../static/UE/ueditor.all.js'; ...

  6. Mac下忘记mysql密码怎么办

    Mac本地安装了数据库,忘记数据库密码的情况下,可以按照以下步骤进行修改密码 step1: 关闭mysql服务: 苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服 ...

  7. Windows 无法安装到所选位置。错误:0x80300001

    Windows 无法安装到所选位置.错误:0x80300001 这里遇到的情况是这样的,iDrac安装windows 2008 R2,一开始映射 windows 2008 R2系统镜像,后来,阵列驱动 ...

  8. QT:QByteArray和QByteArray、char *(转)

    //常用参数类型:char *字符串, QByteArray字符数组, QString字符串//需要转换:char * ---转--- QByteArray ---需要调用QByteArray类的构造 ...

  9. cas sso ajax的jsonp实现方案总结(新浪微薄、淘宝案例分析)

    Cas自定义登录页面Ajax实现:http://cydiay.iteye.com/blog/1738713 CAS 之 跨域 Ajax 登录实践:http://denger.iteye.com/blo ...

  10. emacs之配置之初始目录设置

    emacsConfig/dir-setting.el (setq default-directory "~/" )