在web环境中集成spring环境,也就是在tomcat启动过程中初始化spring容器,tomcat提供ServletContextListener监听类,spring的ServletContextListener继承了他。使用我们一般在web中是这样配置的。
//配置spring配置文件路径
<context-param>
//名字要取contextConfigLocation
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/spring/*-config.xml
</param-value>
</context-param>
//配置监听
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
接下来我们看下ContextLoaderListener这个类是如何初始化spring容器的,ContextLoaderListener从写了下面的方法
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
if (this.contextLoader == null) {
this.contextLoader = this;
}
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
public WebApplicationContext initWebApplicationContext(ServletContext servletContext) { if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) { throw new IllegalStateException( "Cannot initialize context because there is already a root application context present - " + "check whether you have multiple ContextLoader* definitions in your web.xml!"); } Log logger = LogFactory.getLog(ContextLoader.class); servletContext.log("Initializing Spring root WebApplicationContext"); if (logger.isInfoEnabled()) { logger.info("Root WebApplicationContext: initialization started"); } long startTime = System.currentTimeMillis(); try { // Determine parent for root web application context, if any. ApplicationContext parent = loadParentContext(servletContext); //这里初始化spring容器,默认是ConfigurableWebApplicationContext this.context = createWebApplicationContext(servletContext, parent); //把容器放到了servletContext属性里,key是WebApplicationContext.root servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context); ClassLoader ccl = Thread.currentThread().getContextClassLoader(); if (ccl == ContextLoader.class.getClassLoader()) { currentContext = this.context; } else if (ccl != null) { currentContextPerThread.put(ccl, this.context); } if (logger.isDebugEnabled()) { logger.debug("Published root WebApplicationContext as ServletContext attribute with name [" + WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]"); } if (logger.isInfoEnabled()) { long elapsedTime = System.currentTimeMillis() - startTime; logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms"); } return this.context; } catch (RuntimeException ex) { logger.error("Context initialization failed", ex); servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex); throw ex; } catch (Error err) { logger.error("Context initialization failed", err); servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err); throw err; } }
protected WebApplicationContext createWebApplicationContext(ServletContext sc, ApplicationContext parent) { Class<?> contextClass = determineContextClass(sc); if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) { throw new ApplicationContextException("Custom context class [" + contextClass.getName() + "] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]"); } ConfigurableWebApplicationContext wac = (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass); // Assign the best possible id value. String idParam = sc.getInitParameter(CONTEXT_ID_PARAM); if (idParam != null) { wac.setId(idParam); } else { // Generate default id... if (sc.getMajorVersion() == 2 && sc.getMinorVersion() < 5) { // Servlet <= 2.4: resort to name specified in web.xml, if any. wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX + ObjectUtils.getDisplayString(sc.getServletContextName())); } else { wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX + ObjectUtils.getDisplayString(sc.getContextPath())); } } wac.setParent(parent); wac.setServletContext(sc); //这里的CONFIG_LOCATION_PARAM就是上面配置的contextConfigLocation名字 wac.setConfigLocation(sc.getInitParameter(CONFIG_LOCATION_PARAM)); //spring 提供入口可修改容器 customizeContext(sc, wac); //初始化容器 wac.refresh(); return wac; }
相关推荐
在Spring框架中,Web应用的启动流程...这个过程中,Spring展现了其强大的灵活性和可扩展性,使得开发者能够自定义配置,同时保证了应用程序的正常运行。理解这一流程对于深入掌握Spring框架和优化应用性能至关重要。
本文将深入探讨如何在Web项目中集成Spring,包括Spring MVC的使用、配置过程以及关键组件的解释。 首先,Spring的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和对象间的依赖关系。通过XML...
9. **Spring Boot集成**:虽然Spring Web本身不依赖于Spring Boot,但它们通常一起使用,Spring Boot简化了Spring Web的配置和启动过程。 在使用"spring-web-5.2.4"这个版本时,开发者可以获得官方稳定版本带来的...
Spring框架是Java生态系统中最受欢迎的应用开发框架之一,尤其在Web开发领域。将Groovy与Spring结合,可以利用Groovy的简洁语法和动态特性来增强Spring应用的开发效率和可读性。 首先,Groovy在Spring中的应用主要...
标题中的"spring_springweb_"暗示了我们正在讨论Spring框架的一个特定部分,即Spring Web模块。Spring Web是Spring框架的核心部分之一,它提供了构建Web应用程序的基础。它包括Servlet监听器、DispatcherServlet、...
在现代的Spring框架开发中,"spring无web.xml零配置"是一种常见的实践,它通过Java配置(javaconfig)替代了传统的XML配置方式。这种方式使得应用更加灵活,代码更易于理解和维护。下面我们将深入探讨这个主题。 ...
总的来说,Spring在Web容器中的启动过程涉及到`WebApplicationContext`的创建、配置文件的解析、bean定义的加载和bean的实例化。通过这种方式,Spring能够紧密地集成到Web环境中,提供全面的依赖注入和控制反转功能...
Spring框架还提供了大量的模块,如Spring MVC用于构建Web应用,Spring Data用于数据访问,Spring Boot用于快速启动项目,Spring Security提供安全控制等。 **Maven**: Maven是Apache软件基金会开发的项目管理和...
在Spring Initializr中,我们可以选择web依赖来创建一个新的Spring Boot项目。 创建项目后,我们需要在主类上添加`@SpringBootApplication`注解,这是Spring Boot的入口点,它结合了`@Configuration`,`@...
4. **Web 应用集成**:在 Web 应用中,通常会将 Quartz 的 Scheduler 初始化为一个 ServletContextListener,这样在 Web 应用启动时就会自动启动 Scheduler。同时,为了确保在应用关闭时能够停止所有调度,也需要在 ...
- **FlowExecutionListener**:监听Flow执行过程中的事件,可用于日志记录、事务管理等功能。 - **FlowExecutionHolder**:提供当前Flow执行上下文的访问接口。 ### 应用场景 Spring Web Flow适用于多种场景,尤其...
1. 流程定义:在Spring Webflow中,每个用户交互过程被定义为一个流程(Flow)。流程是通过XML文件来描述的,它定义了流程的状态(State)和状态之间的转换(Transition)。 2. 状态:状态是流程中的一个节点,可以...
在Spring框架中,当一个基于Servlet的Web应用启动时,Spring容器的初始化过程是至关重要的。这个过程涉及到多个组件和步骤,让我们详细探讨一下。 首先,我们在`web.xml`配置文件中看到了`<context-param>`和`...
流程执行过程中,Spring WebFlow维护了一个执行上下文,其中包含了当前流程状态、变量、事件等信息。此外,流程执行还支持不同的作用域,包括会话级和请求级,以适应不同的应用场景。 ### 五、测试与调试 为了确保...
在Spring容器的启动过程中,会执行以下步骤:首先,会检查是否已经存在根应用程序上下文,如果不存在,则创建一个新的应用程序上下文。然后,会创建一个新的spring容器,并将其添加到ServletContext中。最后,会将...
在本教程中,我们将探讨如何使用Spring框架的Web模块,即`spring-web`,来搭建一个项目。`spring-web`是Spring框架的核心组件之一,它提供了处理HTTP请求、响应、Servlet容器集成以及与Web相关的功能。以下是详细...
如果在这个过程中遇到问题,比如`ClassNotFoundException`,那通常意味着某个必要的类或者依赖没有被正确地打包或加载。 `ClassNotFoundException` 是Java中常见的异常,它表明JVM尝试加载一个类时,无法找到对应的...
在IT行业中,Spring框架是Java开发领域中广泛使用的开源框架,尤其在构建Web应用程序时。本文将基于"快速搭建一个简易的Spring Web工程"的主题,详细介绍如何从零开始创建一个基本的Spring MVC项目,以便你可以快速...
在Eclipse中创建一个基于Spring的Web应用涉及多个步骤,主要涵盖了Spring框架的Web模块、ApplicationContext的使用以及在Web容器中的配置。以下是详细的过程和相关知识点: 1. **Spring Web模块**: Spring框架...
在本项目中,"Spring-boot web项目实例" 是一个基于Spring Boot框架构建的Web应用程序。Spring Boot是由Pivotal团队提供的一个开源框架,其目的是简化Spring应用的初始搭建以及开发过程,它集成了大量常用的第三方库...