• Spring与Web环境集成


    Spring与Web环境集成


     

    1. ApplicationContext应用上下文获取方式

    应用上下文对象是通过 new ClassPathXmlApplicationContext(Spring配置文件) 方式获取的,但是每次从容器中获取Bean时都要编写 new ClassPathXmlApplicationContext(Spring配置文件),这样的弊端是配置文件加载多次,应用上下文对象创建多次。

     

    在Web项目中,可以使用ServletContextLIstener监听Web应用的启动,我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,再将其存储到最大的域servletContext域中,这样就可以在任意位置获取应用上下文ApplicationContext对象。

     

    2. 创建案例

    1、创建监听器

    复制代码
     package com.ntect.listener;
     ​
     import org.springframework.context.ApplicationContext;
     import org.springframework.context.support.ClassPathXmlApplicationContext;
     ​
     import javax.servlet.ServletContext;
     import javax.servlet.ServletContextEvent;
     import javax.servlet.ServletContextListener;
     ​
     public class ContextLoaderListener implements ServletContextListener {
         public void contextInitialized(ServletContextEvent sce) {
     ​
             ServletContext servletContext = sce.getServletContext();
             //读取web.xml中的全局参数
             String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
             ApplicationContext app = new ClassPathXmlApplicationContext(contextConfigLocation);
             //将Spring的应用上下文对象存储到ServletContext域中
     ​
             servletContext.setAttribute("app",app);
             System.out.println("spring容器创建完毕....");
         }
     ​
         public void contextDestroyed(ServletContextEvent sce) {
     ​
         }
     } 
    复制代码

     

    2、创建获取applicationContext对象的工具类

    复制代码
    package com.ntect.listener;
     ​
     import org.springframework.context.ApplicationContext;
     ​
     import javax.servlet.ServletContext;
     ​
     public class WebApplicationContextUtils {
     ​
         public static ApplicationContext getWebApplicationContext(ServletContext servletContext) {
             return (ApplicationContext)servletContext.getAttribute("app");
         }
     }
     
    复制代码

     

    3、创建servlet的测试类

    复制代码
     package com.ntect.web;
     ​
     import com.ntect.listener.WebApplicationContextUtils;
     import com.ntect.service.UserService;
     import org.springframework.context.ApplicationContext;
     import org.springframework.context.support.ClassPathXmlApplicationContext;
     ​
     import javax.servlet.ServletContext;
     import javax.servlet.ServletException;
     import javax.servlet.http.HttpServlet;
     import javax.servlet.http.HttpServletRequest;
     import javax.servlet.http.HttpServletResponse;
     import java.io.IOException;
     ​
     public class UserServlet extends HttpServlet {
     ​
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             //ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
             ServletContext servletContext = this.getServletContext();
             //ApplicationContext app = (ApplicationContext) servletContext.getAttribute("app");
             ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
             UserService userService = app.getBean(UserService.class);
             userService.save();
         }
     }
    复制代码

     

    4、配置web.xml文件

    复制代码
     <?xml version="1.0" encoding="UTF-8"?>
     <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
              version="4.0"><!--    全局初始化参数-->
         <context-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>applicationContext.xml</param-value>
         </context-param><!--    配置监听器-->
         <listener>
             <listener-class>com.ntect.listener.ContextLoaderListener</listener-class>
         </listener>
         
     <!--    配置测试用的servlet-->
         <servlet>
             <servlet-name>UserServlet</servlet-name>
             <servlet-class>com.ntect.web.UserServlet</servlet-class>
         </servlet><servlet-mapping>
             <servlet-name>UserServlet</servlet-name>
             <url-pattern>/userServlet</url-pattern>
         </servlet-mapping></web-app>
    复制代码

     

    5、测试

    浏览器访问

     http://localhost:8080/userServlet

     

    控制台输出

     

    3. Spring提供获取应用上下文的工具

    上面地分析只是为了方便理解,不用手动实现,Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils获取应用上下文对象。

     

    需要做两件事:

    1、在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标)

    2、使用WebApplicationContextUtils获得应用上下文对象ApplicationContext

     

    3.1 导入Spring集成web的坐标

     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-web</artifactId>
         <version>5.3.16</version>
    </dependency>

     

    3.2 配置ContextLoaderListener监听器

    复制代码
    <!--    全局初始化参数-->
         <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>
    复制代码

     

    3.3 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext

    ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
    UserService userService = app.getBean(UserService.class);

     

  • 相关阅读:
    ReentrantLock原理(未完待续)
    JVM 堆外内存详解
    DataX实现mysql全量数据同步到hdfs
    【逆向】通过新增节移动导出表和重定位表(附完整代码,直接可运行)
    Java + Selenium + Appium自动化测试
    VSCODE 系列(一)VSCODE下载和安装
    Opencv项目实战:16 虚拟拖拽系统
    在云服务器上安装VNC远程桌面服务
    scikit-learn机器学习算法封装
    MacOS下通过命令行启动、关闭Tomcat服务器并验证
  • 原文地址:https://www.cnblogs.com/jbclown/p/16250986.html