Spring mvc 启动配置文件加载两遍问题
问题描述
在使用spring mvc 启动的时候,用到了一个在程序启动时加载的配置方法init-method=”initLoad”,并启动多线程来做数据同步,但是在程序启动之后发现该方法的任务被执行了两次。后来经过测试发现自己的Spring配置文件被加载了两次。如果是定时任务,那么就会出现两个相同的定时任务,可能对程序的数据造成影响。
下面我们分析下什么情况下可能加载两次配置文件。
情况一:web 项目被tomcat 加载两次
项目名称为:“ade3”
tomcat的/webapps 目录:
项目“ade3”部署在tomcat的webapps目录下
tomcat的server.xml配置文件,配置如下:
如上述配置就会加载两次web项目,所以导致初始化方法执行多次,导致数据不一致的情况。
web项目加载两次原因
tomcat中的server.xml 配置:
1. 第一次加载:Host 的 appBase=“webapps” 这样Tomcat在启动的时候会把 tomcat/webapps目录下的所有的项目加载并启动。
2. 第二次加载:Context 的 docBase=“ade3” ,这样tomcat会在查找docBase配置的项目,并加载。
其实相当于tomcat发布了两个项目,两个项目的访问地址为:
1. http://localhost:8080/ade3 (ade3为webapps目录下的项目名)
2. http://localhost:8080/ade (ade为 Context的 path=”/ade”)
解决方法
如果项目部署在tomcat的/webapps 目录下,那么 Context 的 docBase=“”配置为空就可以了。
情况二
- ContextLoaderListener加载applicationContext.xml 文件
- DispatcherServer加载 spring-servlet.xml 文件
applicationContext.xml 和 spring-servlet.xml 可能都定义了系统启动加载初始化定时任务的bean。
这样就会在ContextLoaderListener加载applicationContext.xml时启动定时任务
DispatcherServer加载 spring-servlet.xml时也会启动定时任务。相当于加载了两遍bean。
问题分析
问题就出在ContextLoaderListener和DispatcherServlet,他们都可以引入spring,而且每个引入都会实例化一次bean。如果把两个引入方式配置到同一个文件,那么就会导致一个bean被实例化两次。但是,当我们使用Spring Bean的时候,只会用到DispatcherServlet下的Bean,而不会用到ContextLoaderListener下的Bean,这就会导致ContextLoaderListener的bean不会被用到,而且也不会被内存回收到,产生内存泄漏。
解决方法
ContextLoaderListener加载的spring配置文件中的内容不要和DispatcherServer中加载的spring配置文件的内容重叠。
使用ContextLoaderlistener和DispatcherServlet引入Spring的区别
- ContextLoaderListener和DispatcherServlet都会生成一个WebApplicationContext(上下文),分别以不同的name存放在容器中。
- 同一个容器里,只允许有一个ContextLoaderListener但是可以用多个DispatcherServlet。 DispatcherServlet的context总是ContextLoaderListener的context的子类。
- 在获取bean的时候,会先从DispatcherServlet的context获取,如果没有再从ContextLoaderListener的context获取,这就解释了上面的第一点。
- 如果两者用的是同一份配置文件,或者他们的定义bean有交叉就会造成部分bean永远不会被用到(泄漏)。
- DispatcherServlet还会加载与SpringMVC相关的bean,如RequestMapping…
想了解更多精彩内容请关注我的公众号
本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT
Spring mvc 启动配置文件加载两遍问题相关推荐
- Spring Boot默认配置文件加载顺序(四)
通常情况下,Spring Boot 在启动时会将 resources 目录下的 application.properties 或 apllication.yml 作为其默认配置文件,我们可以在该配置文 ...
- Spring Boot的配置文件加载优先级
基于Spring Boot 2.x详细介绍了Spring Boot的配置文件的加载优先级. 文章目录 1 总体优先级 2 内部配置优先级 3 bootstrap和application的优先级 1 总 ...
- 异常信息配置文件已被另一个程序更改_抢先目睹:SpringBoot2.4配置文件加载机制大变化
翻译: 冷冷.如梦技术 原文链接:spring.io/blog/2020/0- Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 applic ...
- LINUX配置文件加载顺序
LINUX配置文件加载顺序 shell启动方式 启动类型 如何判断是否为交互式 Shell? 有两种方式 判断是否为登录式 Shell ? 同时判断交互式和登录式 配置文件启动 配置文件加载说明 启动 ...
- SpringBoot启动如何加载application.yml配置文件
一.前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件: ...
- Spring boot配置文件加载位置
配置文件加载位置 springboot 启动 会扫描以下位置的application.properties 或者application.yml文件,作为Spring boot的默认配置文件 –file ...
- Spring使用环境变量控制配置文件加载(转)
项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...
- Spring 配置文件加载原理
参考:准备Spring Boot的环境 1 核心原理 ⭐️1 在SpringBoot的环境准备阶段的后期, 发布一个ApplicationEnvironmentPreparedEvent事件 ⭐️2 ...
- 详述 Spring MVC 启动流程及相关源码分析
文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...
最新文章
- ios学习笔记-数据持久化
- 特质波动率python
- PyTorch中如何使用tensorboard可视化
- Struts2+JSON特别让人恶心的一个问题
- AM-资产冻结与停用
- 使用WebClient 获得网页内容或提交请求
- python+BeautifulSoup+多进程爬取糗事百科图片
- C# 正则表达式类 Match类和Group类
- 川农计算机网络题库,川农网院20秋《计算机网络》期末机考
- mmdetection多类目标训练查看单类准确率(AP)以及使用模型测试看结果(show)
- CSE 110: Principles of Programming Languages
- Windows8测试版使用感受
- python生成折线图怎么对特定点做颜色_python库matplotlib绘制折线图,散点图以及设置样式...
- 【转】C/C++中宏使用总结
- 01组-选题与需求分析报告
- 华为ENSP远程登录
- 武汉申报|2022年洪山区科技企业梯次培育专项资金申报指南
- 在抖音找罗永浩干掉辣条
- 姓名大全 导入mysql_My SQL常用操作汇总详解
- python找不到文件怎么办_python中open找不到文件怎么解决
热门文章
- keras从入门到放弃(十五)图片数据增强
- 层次分解位置编码,让BERT可以处理超长文本
- 它来了,它来了,最强目标检测算法YOLO v4,它真的来了!!!
- CVPR 2019 开源论文 | 基于空间自适应归一化的图像语义合成
- 三味Capsule:矩阵Capsule与EM路由
- jieba.posseg.cut方法
- python美化输出模块_Python 格式化输出 ( 颜色 )
- Spring Cloud Security:Oauth2使用入门
- mybatis方法传入多参数
- spring security实现登录验证以及根据用户身份跳转不同页面