文档章节

解决SpringMVC启动过程中地址映射两遍及任务两次启动问题

nonnetta
 nonnetta
发布于 2017/01/23 14:29
字数 634
阅读 115
收藏 1

SpringMVC启动过程中如果你有认真观察的话,你会发现控制台将地址映射的信息打印一遍,并且提醒你,系统已经启动完毕。如果此时你的系统又再次打印了一遍地址映射的信息,并再次提醒你系统启动关闭,那你可就要注意了,你可能存在着地址映射两次的问题。

 

首先我们来看一段XML来分析一下,为什么会有这个问题的存在。

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

上面这个配置有没有很眼熟,如果没有看过的话,你Spring还没学吧,小伙子。。。。

 

大家是不是都习惯性的命名,然后通过扫描一遍扫进去,比如说我:

applicationContext.xml

applicationContext-shiro.xml

applicationContext-redis.xml

applicationContext-servlet.xml

 

首先我们的ContextLoaderListener会根据contextConfigLocation的配置信息去查找相关的配置文件来启动Sping容器,很幸运的是我们配置的值为classpath:applicationContext*.xml,这个配置意味着我们在classpath下配置的所有的配置文件都将会被扫描到Spring容器中(PS:classpath没什么好解释了的吧)。紧接着,所有的配置文件全部被加载成功了,包括SpringMVC在内的applicationContext-servlet.xml配置文件,Spring容器启动完毕了,此时SpringMVC的地址第一次被映射。

 

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

启动完毕了以后,系统还发现你在web.xml中配置了如上信息,你的这个配置,就相当于告诉系统,我要开启SpringMVC功能,DispatcherServlet会根据contextConfigLocation的配置进行加载SpringMVC的相关配置信息,此时SpringMVC的地址第二次被映射。

 

原因很简单,其实就是Spring容器ContextLoaderListener加载了一遍,DispatcherServlet紧接着又加载了一遍, 这就是为什么会映射两遍的原因,解决方案很简单,就是把你的强迫症改掉,把SpringMVC的配置文件的名字改掉,不再被ContextLoaderListener的contextConfigLocation所匹配到就可以了。

 

© 著作权归作者所有

nonnetta
粉丝 7
博文 9
码字总数 8465
作品 0
厦门
高级程序员
私信 提问
解决Quartz定时任务被触发两次的问题(附带:Quartz的测试用例)

很多人在使用spring的Quartz配置定时任务时,会发现每次定时时间到达后,指定的定时方法同时执行了两次。 (P.S. 本人项目用的Jfinal搭建,同样出现该问题。) 解决quartz定时任务被触发两次的...

EugeneQiu
2014/05/15
16.1K
17
Spring 监听器定义两个定时器在同一时间重复执行两次,实际上Spring监听器ApplicationListener执行了3遍

Spring+hibernate定义两个定时器在同一时间重复执行两次,是因为使用了两个定时器导致线程紊乱了吗?在Web程序启动的时候会同时执行两个定时器 两个定时器都是这样写的,现在出现这样的问题 ...

bubblehead
2016/10/21
2.4K
3
Spring Cloud Config 分布式配置中心【Finchley 版】

一、 介绍 1,为什么需要配置中心? 当服务部署的越来越多,规模越来越大,对应的机器数量也越来越庞大,靠人工来管理和维护服务的配置信息,变得困难,容易出错。 因此,需要一个能够动态注...

Jreey
2018/08/23
0
0
Spring task配置,及解决加载两次的方法

关于 启动Task任务同时加载两次的解决方法: 将spring MVC部分的定义另外建立一个文件,同时把Task配置放在此处,然后在web.xml文件中的处加载 <servlet><servlet-name>SpringMVC</servlet-...

夏碌冬藏
2014/08/04
9.1K
2
Spring Boot 2.0(六):使用 Docker 部署 Spring Boot 开源软件云收

只需三步即可部署开源项目云收藏,打造专属个人的收藏系统,就是这么简单! 云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其...

纯洁微笑
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

cleanLastUpdated.bat

@echo offrem create by AnXiaole rem 这里写你的仓库路径set REPOSITORY_PATH=C:\Users\AnXiaole\.m2\repositoryrem 正在搜索...for /f "delims=" %%i in ('dir /b /s "%REPO......

安小乐
2分钟前
0
0
操作放大器的用法是什么?

  有区别   1、单级放大的倍数比较有限,一般在100倍以下。放大倍数很大的话,负反馈就比较浅,对于放大倍数的稳定性不利。假如需要放大倍数更高,就不得不动用多级放大电路了。单级放大...

仙溪
4分钟前
0
0
c++ 上传文件 curl

bool uploadFile(std::string url, std::string file, std::string auth) { boost::filesystem::path p(file); CURL *curl; CURLcode res; struct curl_httppost *for......

青黑
10分钟前
2
0
冒泡与插入排序的代码实现

// 冒泡排序,a 表示数组,n 表示数组大小public void bubbleSort(int[] a, int n) { if (n <= 1) return; for (int i = 0; i < n; ++i) { // 提前退出冒泡循环的标志位 ...

无名氏的程序员
13分钟前
3
0
centos7.6 +mhvtl1.6安装

以前的mhvtl都是在centos6.x,5.x上安装的mhvtl以前版本为1.4,现在最新的1.6出来,可以安装在centos7.6上,下面是安装过程: 1.安装基础包 centos7.6只要能上外网,默认是配置了yun源的,这些...

突突突酱
15分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部