Spring框架:第九章:Spring整合Web

简介: Spring框架:第九章:Spring整合Web

Spring整合Web

在web工程中添加Spring的jar包。

Spring的核心包

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

aop包

spring-aop-4.0.0.RELEASE.jar

spring-aspects-4.0.0.RELEASE.jar

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

JDBC-ORM包

spring-jdbc-4.0.0.RELEASE.jar

spring-orm-4.0.0.RELEASE.jar

spring-tx-4.0.0.RELEASE.jar

Spring的web整合包

spring-web-4.0.0.RELEASE.jar

测试包

spring-test-4.0.0.RELEASE.jar

整合Spring和Web容器分两个步骤:

1、导入spring-web-4.0.0.RELEASE.jar

2、在web.xml配置文件中配置org.springframework.web.context.ContextLoaderListener监听器监听ServletContext的初始化

3、在web.xml配置文件中配置contextConfigLocation上下文参数。配置Spring配置文件的位置,以用于初始化Spring容器

在web.xml中配置

  <!-- needed for ContextLoaderListener -->
  <!--配置SpringIOC容器的配置文件路径-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>location</param-value>
  </context-param>
  <!-- Bootstraps the root web application context before servlet initialization -->
  <!--这个监听器会在web工程启动时候创建Spring IOC 容器。-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

这个监听器会在web工程启动时候读取spring的配置文件,做初始化Spring IOC 容器的操作。

这个Spring IOC 容器对象保存到ServletContext域对象中我们就可以使用Spring IOC容器对象。

我们可以深入进去看看底层源码:

public class ContextLoaderListener extends ContextLoader implements ServletContextListener

可以看到它实现了ServletContextListener,ServletContextListener监听servletContext对象的创建和销毁

在ServletContextListener里可以看到有contextInitialized和contextDestroyed

  // Method descriptor #5 (Ljavax/servlet/ServletContextEvent;)V
  public abstract void contextInitialized(javax.servlet.ServletContextEvent arg0);
  // Method descriptor #5 (Ljavax/servlet/ServletContextEvent;)V
  public abstract void contextDestroyed(javax.servlet.ServletContextEvent arg0);

contextInitialized是servletContext对象的创建

contextDestroyed是servletContext对象的销毁

servletContext对象的创建在web工程启动的时候创建,web工程启动的时候需要有一个springIOC容器

可以看看我们之前的代码@ContextConfiguration(locations = “classpath:applicationContext.xml”)或者

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“applicationContext.xml”);都创建了Spring的IOC容器对象

在创建了Spring的IOC容器对象时我们需要Spring的配置文件:applicationContext.xml

我们在web.xml中配置

  <!--配置SpringIOC容器的配置文件路径-->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>

下面这个监听器一启动就会读取上面的参数:配置文件路径

<!--这个监听器会在web工程启动时候创建Spring IOC 容器。-->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>

我们可以使用DeBug看源码ContextLoaderListener的initWebApplicationContext(event.getServletContext());找到ContextLoader中initWebApplicationContext方法

createWebApplicationContext创建一个Spring容器对象,可以看到它有值了

可以继续往下看configureAndRefreshWebApplicationContext配置和刷新Spring容器

我们进入它的方法体内找到以下代码

String configLocationParam = sc.getInitParameter(CONFIG_LOCATION_PARAM);

它来读取web.xml中<param-name>contextConfigLocation</param-name>的值,获得初始化参数,得到我们自己写的<param-value>classpath:applicationContext.xml</param-value>

把它放到Spring容器中

执行到wac.refresh();位置就开始刷新,执行后要等上一段时间,执行完这段代码后,我们的配置文件applicationContext.xml已经全部加载好了,bean对象也创建好了。

回到initWebApplicationContext方法中执行到

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

其中this.context

它把容器对象放到了servletContext域对象中,使用在web工程中只要获取到servletContext对象就可以在servletContext对象中获取spring容器对象

这就是在web.xml中配置的底层原理

我们如何获取到spring容器对象也就是WebApplicationContext呢?

获取WebApplicationContext上下文对象的方法如下:

方法一(不推荐):

getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

这一个好理解,前面我们容器对象放到了servletContext域对象中,现在获取就好了,不过后面的一长串不好记忆,所以不推荐

方法二(推荐):

WebApplicationContextUtils.getWebApplicationContext(getServletContext())

使用这种的就好些了,不用我们记忆,而且它的底层和方法一是一样的,也是获取getAttribute

相关文章
|
17天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
17天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
3天前
|
Web App开发 JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的深度整合
【9月更文挑战第28天】在现代Web开发领域,Node.js和Express框架的结合已成为打造高性能、易扩展应用的黄金组合。本文将深入探讨如何利用这一技术栈优化Web应用架构,提供具体实践指导,并分析其性能提升的内在机制。通过代码示例,我们将展示从基础搭建到高级功能的实现过程,旨在为开发者提供一条清晰的学习路径,以实现技术升级和项目效率的双重提升。
11 3
|
8天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
505 5
|
5天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
7天前
|
JSON 安全 JavaScript
Web安全-JQuery框架XSS漏洞浅析
Web安全-JQuery框架XSS漏洞浅析
35 2
|
5天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
7天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
24 1
|
13天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
25 2
|
12天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应