Spring MVC 整合 Servlet 3.0
时间:2022-07-22
本文章向大家介绍Spring MVC 整合 Servlet 3.0,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
根据 Servlet 3.0 的新特性,web 容器启动的时候会扫描每个 jar 包下的 /META-INF/services/javax.servlet.ServletContainerInitializer
文件。
使用 Spring MVC 的 web 包,可以看到有这个文件:
文件内容如下:
org.springframework.web.SpringServletContainerInitializer
该类的头部信息如下:
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
Spring 的应用一启动就会加载感兴趣的 WebApplicationInitializer
接口下的组件,并且为这些组件创建对象。
-
AbstractContextLoaderInitializer
:创建根容器 rootAppContext; -
AbstractDispatcherServletInitializer
:- 创建一个 web 的 IOC 容器
servletAppContext
; - 创建一个
dispatcherServlet
; - 将创建的
dispatcherServlet
添加到容器中;
- 创建一个 web 的 IOC 容器
-
AbstractAnnotationConfigDispatcherServletInitializer
:注解方式配置dispatcherServlet
的初始化器:- 首先创建根容器;
- 创建 web
IOC
容器;
所以我们要想以注解的方式启动 SpringMVC 只需要写一个类继承 AbstractAnnotationConfigDispatcherServletInitializer
,然后实现抽象方法指定 DispatcherServlet
的配置信息。
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 获取根容器的配置类: 相当于 Spring 的配置文件
*
* @return 根容器的配置类
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
/**
* 获取 Web 容器的配置类: 相当于 Spring MVC 的配置文件
*
* @return Web 容器的配置类
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{ServletConfig.class};
}
/**
* 获取 Servlet 的映射信息
* "/" 代表拦截所有请求: 包括静态资源,但是不拦截 *.jsp
* "/*" 也是拦截所有请求,也拦截 *.jsp
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
指定两个类,一个是根容器的配置类,另一个是 Web 容器的配置类,两个容器是父子容器的关系。
根容器只扫描所有的 Service
和 Repository
组件,所以要排除 Controller
。
@ComponentScan(value = "top.wsuo", excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
})
public class RootConfig {
}
而 Web 容器只扫描 Controller
。
@ComponentScan(value = "top.wsuo", includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class ServletConfig {
}
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2g2deaym94lc8
- JS魔法堂:不完全国际化&本地化手册 之 拓展篇
- 使用jQuery的animate方法制作滑动菜单
- jenkins 入门教程(下)
- CSS3制作心形头像
- CSS魔法堂:重拾Border之——不仅仅是圆角
- scala 学习笔记(01) 函数定义、分支、循环、异常处理、递归
- java之log4j的配置
- scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例
- scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类
- 使用jQuery封装实用函数
- scala 学习笔记(05) OOP(中)灵活的trait
- Web Fundamentsals学习1-Multiple-Screen-Site
- Vagrant使用
- java 中的异步回调
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Vue.js 教程:构建一个特斯拉汽车余电计算器
- 文件系统:隐匿在 Linux 背后的机制
- MySQL在Docker环境下运行基础
- Redis 秒杀实战
- Oracle 19c集群重装步骤详解
- 神经网络训练中回调函数的实用教程
- DGA域名检测的数据分析与深度学习分类
- Saferwall:下一代开源恶意软件分析平台
- Java安全编码之SQL注入
- Wireshark解密HTTPS流量
- 独家 | 如何用XGBoost做时间序列预测?
- 关于Web点击劫持的一些实例
- LeetCode 爬取官网所有题目和自己的最近题解
- 一张图实现3D人脸建模!这是中科院博士生入选ECCV的新研究 | 开源
- client-go 之 DeltaFIFO 实现原理