> 文档中心 > Spring与Web环境集成

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文件

       contextConfigLocation  applicationContext.xml      ​        com.ntect.listener.ContextLoaderListener                  UserServlet  com.ntect.web.UserServlet      ​       UserServlet  /userServlet      ​ 

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的坐标

      org.springframework     spring-web     5.3.16

3.2 配置ContextLoaderListener监听器

       contextConfigLocation  classpath:applicationContext.xml      ​        org.springframework.web.context.ContextLoaderListener     

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

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

 

Spring与Web环境集成 2022深度学习开发者峰会 Spring与Web环境集成 5月20日13:00让我们相聚云端,共襄盛会!