WEB.XML 中SPRING 配置及重复加载问题

Posted on 2012-11-13, 15:48, by tmser, under java 周边 .

项目内存溢出,mat 查看了一下发现spring 存在两个实例。回过头看启动日志,果然spring被重复加载了。

在实际项目中spring的配置文件 applicationcontext.xml是通过spring提供的加载机制,自动加载的容器中去,在web项目中,配置文件加载到web容器中进行 解析,目前,spring提供了两种加载器,以供web容器的加载:一种是ContextLoaderListener,另一种是 ContextLoaderServlet。这两种在功能上完全相同,只是一种是基于Servlet2.3版本中新引入的Listener接口实现,而另 一种是基于Servlet接口实现,以下是这两种加载器在web.xml中的时机配置应用:

第一种:

<listener>
 <listener-class>org.springframework.context.ContextLoaderListener</listener-class>
</listener>

另一种:

<servlet>
 <servlet-name>context</servlet-name>
 <servlet-class>org.springframework.context.ContextLoaderServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>

通过上面的配置,web容器会自动加载applicationcontext.xml初始化。

如果需要指定配置文件的位置,可通过context-param加以指定:

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>

之后,可以通过

WebApplicationContextUtils.getWebApplicationContext方法在web应用中获取applicationcontext的引用。

另外注意不要两种方式都配置上,如果配置了,虽然不会报错,但会导致spring 加载两遍。存在两个BeanFactory 实例。

这样就会在ContextLoaderListener加载applicationContext.xml时启动定时任务 
DispatcherServer加载 spring-servlet.xml时也会启动定时任务。相当于加载了两遍bean。

使用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…

TOmcat、ServerLet解析:

在TOMCAT启动的时候,自动执行一个SERVLET类,这个类主要作用是生成文件的。 此时我的系统要运行正常,可以做其它的事情。 
百度了一下, 
第一步:在web.xml文件中添加[size=medium]

  1. <servlet>
  2. <servlet-name>servlet的名字</servlet-name>
  3. <servlet-class>servlet所在的包的路径</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>

如:

  1. <servlet>
  2. <servlet-name>WriteFileServlet</servlet-name>
  3. <servlet-class>com.util.WriteFileServlet</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>

第二步:在WriteFileServlet中进行初始化

  1. public void init() throws ServletException {
  2. // Put your code here
  3. //前提是把操作的方法封装到了一个类中,然后在这里调用的方法。或者是把操作直接写在这里也可以,但是这种方法不太好。
  4. }

这样就可以在tomcat启动的时候,自动执行这一个servlet了,web.xml是可以包含多个servlet标签的。 
但是问题来了,只有在tomcat启动完成后用户才可以访问系统,但是此时只有tomcat加载完成servlet中的生成文件的方法后

,tomcat才会启动完成,用户才可以访问。也就是不可以用户一边访问系统,后台一边运行servlet生成文件。

解决办法是:在servlet中加入多线程,让servlet类实现Runnable接口。把方法放在线程中执行,这样就可以实现用户一边访问系统,后台一边生成文件了。 

spring配置加载2次实例问题。的更多相关文章

  1. 整合多个maven工程时Spring配置加载JDBC问题

    问题叙述: 两个工程都通过JDBC访问mysql数据库,各自运行OK, 但合并成一个maven工程后,发现前一个工程访问数据库异常,貌似拿不到自己的DAO. 解决办法: 发现这两个工程的xml配置中, ...

  2. 【串线篇】spring boot外部配置加载顺序

    SpringBoot也可以从以下位置加载配置: 原则仍然是优先级从高到低:高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 1.命令行参数 所有的配置都可以在命令行上进行指定 java -j ...

  3. 精尽Spring Boot源码分析 - 配置加载

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  4. Spring Cloud Nacos实现动态配置加载的源码分析

    理解了上述Environment的基本原理后,如何从远程服务器上加载配置到Spring的Environment中. NacosPropertySourceLocator 顺着前面的分析思路,我们很自然 ...

  5. Bean XML 配置(1)- 通过XML配置加载Bean

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  6. 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    [SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...

  7. spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)转

    关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用 ...

  8. Spring中加载xml配置文件的六种方式

    Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog  因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...

  9. Java实现配置加载机制

    前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty…等等数都数不过来的软件,要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这 ...

随机推荐

  1. Myeclipse 编译等级

    1.Java compiler level does not match the version of the installed Java project facet. 问题描述:编译等级不匹配 解 ...

  2. 机器学习算法实践:朴素贝叶斯 (Naive Bayes)(转载)

    前言 上一篇<机器学习算法实践:决策树 (Decision Tree)>总结了决策树的实现,本文中我将一步步实现一个朴素贝叶斯分类器,并采用SMS垃圾短信语料库中的数据进行模型训练,对垃圾 ...

  3. 一个java调用python的问题

    使用 ProcessBuilder List<String> commands = new ArrayList(); commands.add("python"); c ...

  4. 2017.7.7 postgreSQL在插入造成重复时执行更新

    参考来自:https://stackoverflow.com/questions/1109061/insert-on-duplicate-update-in-postgresql/1109198#11 ...

  5. Web项目中用mybatis配置多个数据库

    需要在项目中配置多个数据库(比如一个mysql,一个oracle)的时候,可按照如下方式配置 首先是第一个数据库的配置 <bean name="transactionManager&q ...

  6. AndroidStudio怎么实现微信分享功能

    在应用中添加微信分享功能,需要在微信开放平台上传你的应用,审核通过后方可使用此功能. https://open.weixin.qq.com/网址 申请的过程比较简单,这里就不追溯了,贴一个友情链接 h ...

  7. Angular 学习笔记——service &constant

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  8. [linux]vmstat命令详解-显示虚拟内存状态

    本文转载于http://man.linuxde.net/vmstat 前言:Linux系统的内存分为物理内存和虚拟内存两种.物理内存是真实的,也就是物理内存条上的内存.而虚拟内存则是采用硬盘空间补充物 ...

  9. smali语法高亮相关链接

    http://ruby-china.org/topics/8307 http://www.daqianduan.com/4820.html http://www.cnblogs.com/ruochen ...

  10. Python 多线程和单线程本质应用区别

    先了解下CPU的简单运行原理: 它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成成千上万个时间片段,这个核心确实同时只能运行一个任务:但是可以将多个任务交替执行,比如上一个时间片段 ...