11. Spring 集成WEB环境
Maven 所以 记得导入依赖
Servlet 和 JSP 的依赖【GAV】:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency>
因为我们有了Servlet之后 我们每次去执行他 他每次会去 创建 ApplicationContext应用上下文对象,这样很繁琐,如果有100个Servlet 那么要创建100个? 官方点的说法:
应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从 容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,
这样的弊端是配置 文件加载多次,应用上下文对象创建多次。
解决方案:
在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加 载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域 中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。
所以大体的监听器代码就是:
ContextListener.java :
package com.bihu.listener; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebListener public class ContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ApplicationContext app = new ClassPathXmlApplicationContext("app.xml"); ServletContext servletContext = sce.getServletContext(); //将ApplicationContext 上下文对象装入 servletContext中. servletContext.setAttribute("applicationContext",app); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println(sce.getServletContext() + "销毁了"); } }
如果你要获取上下文对象 直接在Servlet中获取ApplicationContext的那个 getAttribute 即可。
Test.java 【Servlet】
package com.bihu.web; import com.bihu.Service.TestService; import com.bihu.Service.TestServiceImpl; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet(name = "Test", value = "/Test") public class Test extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取ApplicationContext对象: ApplicationContext app = (ApplicationContext)request.getServletContext().getAttribute("applicationContext"); //获取Bean TestServiceImpl serviceImpl = (TestServiceImpl)app.getBean("serviceImpl"); serviceImpl.start(); //执行方法 } }
其实就是 不要让他太消耗资源的意思 好嘞啊 不想学了 烦...
原理都在这,但是这样也很麻烦 都说框架框架 所以我们用框架自带监听器来回去上下文对象的:
Spring提供获取应用上下文的工具:
Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工 具WebApplicationContextUtils供使用者获得应用上下文对象。
所以我们需要做的只有两件事:
① 在web.xml中配置ContextLoaderListener监听器(需要先导入spring-web坐标)
② 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext
1. 导入Spring集成web的坐标 和 配置监听器
gav坐标:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.5.RELEASE</version> </dependency>
配置ContextLoaderListener监听器:[加入到web.xml 即可... 下面的知识点是之前学的Servlet 和 JSP 的原始配置]
<!--全局参数--> <context-param> <param-name>contextConfigLocation</param-name> <!--这个东西是spring-web包的 写死的--> <param-value>classpath:app.xml</param-value> <!--这个东西指的是 你 Spring的配置文件目录--> </context-param> <!--Spring的监听器 下面也是写死的 spring-web包的东西--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
最后就可以获取 在Spring配置文件夹中 获取 Bean了:
Test.java 【Serclet】
package com.bihu.web; import com.bihu.Service.TestService; import com.bihu.Service.TestServiceImpl; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet(name = "Test", value = "/Test") public class Test extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //注意这里的WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());,参数是这个ServletContext() ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); //获取Spring中的Bean 这里没什么好说的 TestServiceImpl serviceImpl = (TestServiceImpl)applicationContext.getBean("serviceImpl"); serviceImpl.start(); } }
这个方法一般也不用的,其原理就是监听器嘛 内置 ServletContext 监听器 然后在初始化参数哪里配置点东西进去 然后就一系列的搞搞搞 最终目的还就是:
获取上下文对象.....无语子
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14932782.html