`
lzzy_alex
  • 浏览: 30064 次
社区版块
存档分类
最新评论

spring 上下文被重复加载的问题记事

 
阅读更多

项目环境:springmvc, spring, hibernate

 

事情是这样的,项目在启动时需要启动一个线程,执行扫描任务,因为不是例行性任务,所以不考虑quartz,要完成这个功能,可以有多种实现方法,比如:

 

1. 自定义监听器

public class StartupListener implements ServletContextListener {
  public void contextInitialized(ServletContextEvent event) {
    ServletContext context = event.getServletContext();
    ApplicationContext cxt = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
    Scanner scanner = (Scanner) ctx.getBean("scanner ");
    scanner.start();
  }
}
<listener>
 <listener-class>com.blablah.StartupListener</listener-class>
</listener>

 

2. 实现spring InitializingBean 接口

@Component
public class ScanTask implements InitializingBean {
   @Autowired private Scanner scanner;
   public void afterPropertiesSet() throws Exception {
      scanner.start();
   }
}

 

可项目启动后却发现扫描线程被启动了两次,即有两个Scanner实例在运行,这造成了数据的混乱,这时的web.xml 配置是这样的:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml </param-value>
</context-param>
 
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:springmvc-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

 

造成这一问题的原因,是spring的ContextLoaderListener与springmvc的DispatcherServlet在启动时重复加载了spring上下文,网上也有很多建议方案,比如:

Spring MVC – Beans loaded twice:http://www.mkyong.com/spring-mvc/spring-mvc-beans-loaded-twice

Spring - application Initialized twice? :

http://stackoverflow.com/questions/20704086/spring-application-initialized-twice

 

然而,在尝试两者的建议后,问题却依然没有解决。既然它们的目的都是加载上下文,那启动一个不就可以了吗,于是修改web.xml,使用DispatcherServlet加载spring和springmvc上下文信息,问题得到解决:

 

<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext.xml,classpath:springmvc-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
分享到:
评论

相关推荐

    springmvc spring 两套上下文问题

    在Spring MVC和Spring框架的整合应用中,常常会遇到两套上下文的问题。Spring MVC是Spring框架的一个模块,主要用于处理Web请求,而Spring则提供了一个更广泛的IoC(Inversion of Control,控制反转)和AOP(Aspect ...

    利用Spring Context上下文创建自定义对象

    在Spring框架中,Spring Context上下文是核心组件之一,它为开发者提供了强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)功能。本篇文章将深入探讨如何利用Spring ...

    第二十章 Spring 应用上下文生命周期(ApplicationContext Lifecycle)1

    本章将深入探讨Spring应用上下文的生命周期,从启动准备阶段到关闭阶段,包括各个关键步骤和相关组件的作用。 1. **Spring 应用上下文启动准备阶段** 在这个阶段,AbstractApplicationContext的`prepareRefresh()`...

    基于spring的多线程上下文处理服务,源码

    Maven项目,可直接编译通过,已经有一个测试的数据读取 和一个测试的...上下文读取器配置添加至readerPool.readers; 上下文处理器配置添加至serviceProcessors.services; 分析链线程数配置serviceProcessors.threadCount;

    Spring Bean重复执行两次(实例被构造两次)问题分析

    在Spring框架中,Bean的生命周期管理是其核心特性之一,然而有时我们可能会遇到Spring Bean重复执行两次的问题,即实例被构造两次。这个问题可能是由多种原因引起的,涉及到Spring的初始化过程和容器的行为。以下是...

    Spring Boot 全局懒加载机制.docx

    在传统的Spring应用中,我们可以通过在bean定义上添加`@Lazy`注解来实现单个bean的懒加载。例如: ```java @Lazy @Configuration public class DemoConfig { public DemoConfig() { log.warn(" &gt; &gt; &gt; demoConfig ...

    Spring动态加载配置文件

    总的来说,Spring动态加载配置文件的实现涉及到文件监听、配置文件解析、应用上下文刷新以及Web容器的协同。通过这样的机制,开发者可以在开发阶段快速响应配置的更改,提高开发效率,同时降低生产环境因重启服务...

    springloaded spring-boot 热加载

    springloaded spring-boot 热加载

    通过Spring上下文获取bean的实例对象

    通过Spring上下文获取bean的实例对象

    Spring boot 热加载 springloaded-1.2.4.RELEASE JAR包

    3. **代理类的生命周期管理**: SpringLoaded能够智能地处理旧实例的销毁和新实例的创建,确保应用状态的一致性,避免因热加载导致的潜在问题。 4. **与IDE集成**: 开发者通常会使用IDE(如IntelliJ IDEA或Eclipse)...

    如何获得spring上下文的方法总结

    如何获得Spring上下文的方法总结 在Spring框架中,获得上下文的方法是非常重要的,通过本文,我们将详细介绍获得Spring上下文的方法总结,并结合示例代码进行详细解释。 一、获得上下文的方法总结 在Spring框架中...

    详解spring boot容器加载完后执行特定操作

    "Spring Boot 容器加载完成后执行特定操作" Spring Boot 框架提供了多种方式来执行容器加载完成后的特定操作,例如使用 ApplicationListener 接口或使用 @PostConstruct 注解。在本文中,我们将介绍使用 ...

    Spring中使用classpath加载配置文件浅析

    本文将详细分析Spring通过classpath加载配置文件的不同情形,并提供解决加载过程中可能遇到的问题的方法。 首先,我们来看一下Spring加载配置文件的基本方式。在Spring中,可以通过ApplicationContext接口的实现类...

    Spring中ApplicationContext加载机制

    Spring中ApplicationContext加载机制 ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供...

    SpringBoot上下文初始器加载过程详解

    SpringBoot 上下文初始器加载过程详解 SpringBoot 上下文初始器加载过程详解主要介绍了 SpringBoot 上下文初始器加载过程的详细实现步骤,通过示例代码对关键方法进行了详细的解释,对大家的学习或者工作具有一定...

    如何加载jar包中的spring配置文件

    在SSM整合中,Spring配置文件通常包括Spring MVC的配置(如`dispatcher-servlet.xml`)、Spring的根上下文配置(如`applicationContext.xml`)以及MyBatis的配置(如`mybatis-config.xml`)。如果某些配置文件(比如...

    Spring IoC加载流程讲解

    Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...

    Spring3.0 配置文件中加载Properties文件的小例子

    本篇将详细讲解如何在Spring 3.0的配置文件中加载Properties文件,以便在运行时动态获取和使用这些配置。 首先,我们需要一个Properties文件,例如`application.properties`,它通常放在项目的类路径根目录下。这个...

    Spring-Context:Spring上下文上下文

    - Spring上下文可以加载各种类型的资源,如文件、数据库连接、JNDI查找等。通过Resource接口,可以对这些资源进行操作。 4. **事件发布** - Spring提供了一个事件驱动的模型,允许在一个应用程序上下文中发布...

    struts加载spring的方法

    2. **配置Spring监听器**:在`web.xml`文件中,需要配置一个Spring的上下文监听器`ContextLoaderListener`,该监听器负责初始化Spring的ApplicationContext。具体配置如下所示: ```xml &lt;listener-class&gt;org....

Global site tag (gtag.js) - Google Analytics