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 监听器 然后在初始化参数哪里配置点东西进去 然后就一系列的搞搞搞 最终目的还就是:
获取上下文对象.....无语子
作者:咸瑜