问题描述

在使用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的区别

  1. ContextLoaderListener和DispatcherServlet都会生成一个WebApplicationContext(上下文),分别以不同的name存放在容器中。
  2. 同一个容器里,只允许有一个ContextLoaderListener但是可以用多个DispatcherServlet。 DispatcherServlet的context总是ContextLoaderListener的context的子类。
  3. 在获取bean的时候,会先从DispatcherServlet的context获取,如果没有再从ContextLoaderListener的context获取,这就解释了上面的第一点。
  4. 如果两者用的是同一份配置文件,或者他们的定义bean有交叉就会造成部分bean永远不会被用到(泄漏)。
  5. DispatcherServlet还会加载与SpringMVC相关的bean,如RequestMapping…

想了解更多精彩内容请关注我的公众号

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

Spring mvc 启动配置文件加载两遍问题相关推荐

  1. Spring Boot默认配置文件加载顺序(四)

    通常情况下,Spring Boot 在启动时会将 resources 目录下的 application.properties 或 apllication.yml 作为其默认配置文件,我们可以在该配置文 ...

  2. Spring Boot的配置文件加载优先级

    基于Spring Boot 2.x详细介绍了Spring Boot的配置文件的加载优先级. 文章目录 1 总体优先级 2 内部配置优先级 3 bootstrap和application的优先级 1 总 ...

  3. 异常信息配置文件已被另一个程序更改_抢先目睹:SpringBoot2.4配置文件加载机制大变化

    翻译: 冷冷.如梦技术 原文链接:spring.io/blog/2020/0- Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 applic ...

  4. LINUX配置文件加载顺序

    LINUX配置文件加载顺序 shell启动方式 启动类型 如何判断是否为交互式 Shell? 有两种方式 判断是否为登录式 Shell ? 同时判断交互式和登录式 配置文件启动 配置文件加载说明 启动 ...

  5. SpringBoot启动如何加载application.yml配置文件

    一.前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件: ...

  6. Spring boot配置文件加载位置

    配置文件加载位置 springboot 启动 会扫描以下位置的application.properties 或者application.yml文件,作为Spring boot的默认配置文件 –file ...

  7. Spring使用环境变量控制配置文件加载(转)

    项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...

  8. Spring 配置文件加载原理

    参考:准备Spring Boot的环境 1 核心原理 ⭐️1 在SpringBoot的环境准备阶段的后期, 发布一个ApplicationEnvironmentPreparedEvent事件 ⭐️2 ...

  9. 详述 Spring MVC 启动流程及相关源码分析

    文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...

最新文章

  1. ios学习笔记-数据持久化
  2. 特质波动率python
  3. PyTorch中如何使用tensorboard可视化
  4. Struts2+JSON特别让人恶心的一个问题
  5. AM-资产冻结与停用
  6. 使用WebClient 获得网页内容或提交请求
  7. python+BeautifulSoup+多进程爬取糗事百科图片
  8. C# 正则表达式类 Match类和Group类
  9. 川农计算机网络题库,川农网院20秋《计算机网络》期末机考
  10. mmdetection多类目标训练查看单类准确率(AP)以及使用模型测试看结果(show)
  11. CSE 110: Principles of Programming Languages
  12. Windows8测试版使用感受
  13. python生成折线图怎么对特定点做颜色_python库matplotlib绘制折线图,散点图以及设置样式...
  14. 【转】C/C++中宏使用总结
  15. 01组-选题与需求分析报告
  16. 华为ENSP远程登录
  17. 武汉申报|2022年洪山区科技企业梯次培育专项资金申报指南
  18. 在抖音找罗永浩干掉辣条
  19. 姓名大全 导入mysql_My SQL常用操作汇总详解
  20. python找不到文件怎么办_python中open找不到文件怎么解决

热门文章

  1. keras从入门到放弃(十五)图片数据增强
  2. 层次分解位置编码,让BERT可以处理超长文本
  3. 它来了,它来了,最强目标检测算法YOLO v4,它真的来了!!!
  4. CVPR 2019 开源论文 | 基于空间自适应归一化的图像语义合成
  5. 三味Capsule:矩阵Capsule与EM路由
  6. jieba.posseg.cut方法
  7. python美化输出模块_Python 格式化输出 ( 颜色 )
  8. Spring Cloud Security:Oauth2使用入门
  9. mybatis方法传入多参数
  10. spring security实现登录验证以及根据用户身份跳转不同页面