一、spring搭建web项目环境
1、存在问题
- 做的是javase项目的有main方法,在main方法里面创建ApplicationContext对象,即可获得想要的对象
- 而web项目没有main方法,在tomcat上运行,tomcat一启动,项目一直运行
- 所以容器的创建就需要换一种方式
注意:maven创建的web项目的web.xml里面的Servlet版本很低很低,所以要从别的地方复制过来一份4.0版本的
2、解决问题
使用监听器的功能,可以避免在每一次调用Controller 的时候创建ApplicationContext对象 把spring容器放到全局作用域对象中去【ServletContext】
- 监听器作用
- 创建容器对象,执行
ApplicationContext ac = new ClassPathApplicationContext("application-context.xml");
- 把容器对象放入到 ServletContext中,
ServletContext.setAttribute(key,ac);
3、代码实现
监听器可以自己创建,也可以使用框架中提供好的ContextLoaderListener
为了使用框架自动提供好的监听器,首先添加依赖
<!--spring的监听器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
在web.xml注册监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
监听器被创建以后,会读取 /WEB-INF/applicationContext.xml 文件
(1) 因为监听器里面要创建ApplicationContext对象,那么他需要加载配置文件,
(2) 而 /WEB-INF/applicationContext.xml 是监听器默认读取spring配置文件的路径
在项目中我们一般都修改默认文件的位置, 使用context-param重新指定文件的位置【web.xml文件中配置】
<context-param>
<!--param-name:表示配置文件的路径,相当于变量名-->
<param-name>contextContextLocation</param-name>
<!--自定义配置文件的路径-->
<param-value>classpath:spring.xml</param-value>
</context-param>
配置完之后就可以在controller类里面获取到容器后,就可以用了【不用 用下面的功能方法】
WebApplicationContext wac = null;
String key = WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;
Object attr = getServletContext().getAttribute(key);
If(attr ! = null){
Wac = (WebApplicationContext) attr;
}
此时 wac就是spring容器 就可以直接往里面getBean()
spring提供的工具方法(常用)获取容器对象
WebApplicationContext wac = null;
ServletContext sc = getServletContext();
//这样就得到spring容器
wac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);