项目环境: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>
相关推荐
在Spring MVC和Spring框架的整合应用中,常常会遇到两套上下文的问题。Spring MVC是Spring框架的一个模块,主要用于处理Web请求,而Spring则提供了一个更广泛的IoC(Inversion of Control,控制反转)和AOP(Aspect ...
在Spring框架中,Spring Context上下文是核心组件之一,它为开发者提供了强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)功能。本篇文章将深入探讨如何利用Spring ...
本章将深入探讨Spring应用上下文的生命周期,从启动准备阶段到关闭阶段,包括各个关键步骤和相关组件的作用。 1. **Spring 应用上下文启动准备阶段** 在这个阶段,AbstractApplicationContext的`prepareRefresh()`...
Maven项目,可直接编译通过,已经有一个测试的数据读取 和一个测试的...上下文读取器配置添加至readerPool.readers; 上下文处理器配置添加至serviceProcessors.services; 分析链线程数配置serviceProcessors.threadCount;
在传统的Spring应用中,我们可以通过在bean定义上添加`@Lazy`注解来实现单个bean的懒加载。例如: ```java @Lazy @Configuration public class DemoConfig { public DemoConfig() { log.warn(" > > > demoConfig ...
在Spring框架中,Bean的生命周期管理是其核心特性之一,然而有时我们可能会遇到Spring Bean重复执行两次的问题,即实例被构造两次。这个问题可能是由多种原因引起的,涉及到Spring的初始化过程和容器的行为。以下是...
总的来说,Spring动态加载配置文件的实现涉及到文件监听、配置文件解析、应用上下文刷新以及Web容器的协同。通过这样的机制,开发者可以在开发阶段快速响应配置的更改,提高开发效率,同时降低生产环境因重启服务...
springloaded spring-boot 热加载
通过Spring上下文获取bean的实例对象
3. **代理类的生命周期管理**: SpringLoaded能够智能地处理旧实例的销毁和新实例的创建,确保应用状态的一致性,避免因热加载导致的潜在问题。 4. **与IDE集成**: 开发者通常会使用IDE(如IntelliJ IDEA或Eclipse)...
如何获得Spring上下文的方法总结 在Spring框架中,获得上下文的方法是非常重要的,通过本文,我们将详细介绍获得Spring上下文的方法总结,并结合示例代码进行详细解释。 一、获得上下文的方法总结 在Spring框架中...
"Spring Boot 容器加载完成后执行特定操作" Spring Boot 框架提供了多种方式来执行容器加载完成后的特定操作,例如使用 ApplicationListener 接口或使用 @PostConstruct 注解。在本文中,我们将介绍使用 ...
本文将详细分析Spring通过classpath加载配置文件的不同情形,并提供解决加载过程中可能遇到的问题的方法。 首先,我们来看一下Spring加载配置文件的基本方式。在Spring中,可以通过ApplicationContext接口的实现类...
Spring中ApplicationContext加载机制 ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供...
SpringBoot 上下文初始器加载过程详解 SpringBoot 上下文初始器加载过程详解主要介绍了 SpringBoot 上下文初始器加载过程的详细实现步骤,通过示例代码对关键方法进行了详细的解释,对大家的学习或者工作具有一定...
在SSM整合中,Spring配置文件通常包括Spring MVC的配置(如`dispatcher-servlet.xml`)、Spring的根上下文配置(如`applicationContext.xml`)以及MyBatis的配置(如`mybatis-config.xml`)。如果某些配置文件(比如...
Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...
本篇将详细讲解如何在Spring 3.0的配置文件中加载Properties文件,以便在运行时动态获取和使用这些配置。 首先,我们需要一个Properties文件,例如`application.properties`,它通常放在项目的类路径根目录下。这个...
- Spring上下文可以加载各种类型的资源,如文件、数据库连接、JNDI查找等。通过Resource接口,可以对这些资源进行操作。 4. **事件发布** - Spring提供了一个事件驱动的模型,允许在一个应用程序上下文中发布...
2. **配置Spring监听器**:在`web.xml`文件中,需要配置一个Spring的上下文监听器`ContextLoaderListener`,该监听器负责初始化Spring的ApplicationContext。具体配置如下所示: ```xml <listener-class>org....