springmvc web.xml配置之 -- SpringMVC IOC容器初始化
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容器初始化过程一般需要三个步骤,
- Resource定位(Bean的定义文件定位)
- 将Resource定位好的资源载入到BeanDefinition
- 将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容器初始化的更多相关文章
- SpringMvc web.xml配置详情
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...
- springmvc web.xml配置之 -- DispatcherServlet
springMVC servlet配置与启动 看一下springmvc的web.xml常见配置: <servlet> <!-- 配置DispatcherServlet --> ...
- springmvc web.xml配置之 -- ContextLoaderListener
首先回归一下web.xml的常用配置,看一个示例: <context-param> <param-name>contextConfigLocation</param-na ...
- Java web.xml 配置技巧—动态欢迎页地址
我们的 Java Web 项目在配置web.xml 欢迎页地址默认是index.html .index.jsp ,不知道有人注意过没有,如果我要配置成/index/user.action 或者 ...
- springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置
前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...
- springmvc学习指南 之---第27篇 spring如何实现servlet3.0无web.xml 配置servlet对象的
writedby 张艳涛 基于web.xml配置,有人说麻烦,tomcat给按照servlet3.0,实现了基于注解@WebServlet,有人说springmvc的springmvc.xml配置麻烦 ...
- springMVC WebApplicationInitializer 替代web.xml 配置Servlet 之原理
Servlet 3.0之前 ,xml 配置 在过去搭建spring + springMCV ,首先第一步要做的是什么 ,就是要配置web.xml 文件 ,把springMVC 中的Servlet 加 ...
- Maven-SSM项目pom.xml配置以及springmvc配置以及mybatis配置及web.xml配置
一.Maven本地仓库的pom.xml配置 (全部是mysql数据库) <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- Spring 及 SpringMVC的web.xml配置详解
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...
随机推荐
- 集成学习之Boosting —— Gradient Boosting实现
Gradient Boosting的一般算法流程 初始化: \(f_0(x) = \mathop{\arg\min}\limits_\gamma \sum\limits_{i=1}^N L(y_i, ...
- kubernetes1.7新特:kubectl支撑中文字符集
背景介绍 在Kubernetes架构图中可以看到,节点(Node)是一个由管理节点委托运行任务的worker. 它能运行一个或多个Pods,节点(Node)提供了运行容器环境所需要的所有必要条件,在K ...
- ubuntu遇到的问题
昨天分辨率在装一个游戏时被更改了,改过之后,怎么都改不过来... 折腾了一下午,在配置文件中/etc/X11/xorg.conf.failsafe,但是网上都是/etc/X11/xorg.conf, ...
- YAML文件格式入门
YAML快速入门 https://www.jianshu.com/p/97222440cd08 https://yaml.org/spec/1.2/spec.pdf http://nodeca.git ...
- 使用UltraISO制作U盘启动
下面给你提供是的一个万能的制作系统U盘的方法,用这个U盘你可以加载任何你想要的系统,即使是Linux系统都是可以,你需要做的就是下载安装软件,下载一个系统安装光盘的镜像文件,然后用软件导入到U盘就可以 ...
- posix对线程的调整
fork 当多线程进程调用fork创建子进程时,从fork返回时,只有调用fork的线程在进程内存在(其他线程在子进程中不存在,好比调用pthread_exit退出,不再拥有私有数据destructo ...
- VB中上传下载文件到SQL数据库
VB中上传下载文件到SQL数据库 编写人:左丘文 2015-4-11 近期在修改一个VB编写的系统时,想给画面增加一个上传文件到数据库,并可以下载查看的功能,今天在这里,我想与大家一起分享代码,在此做 ...
- postman全方位讲解(有空看下)
Postman 接口测试神器 Postman 是一个接口测试和 http 请求的神器,非常好用. 官方 github 地址: https://github.com/postmanlabs Postma ...
- ROS创建Web代理(Web proxy)给QQ使用HTTP代理
使用Web代理可以提高网页的访问速度,因为访问的数据会存储在内存或是硬盘中,就会直接从代理服务器中读取.同时,为了提高网络访问的安全性,可以给Web代理服务器设置相应的权限,使它的安全性得到提高. 下 ...
- Eclipse Android 代码自动提示功能 +导入 epf
1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist ...