Spring WebAppInitializer 的原理与用例

使用 Spring 框架的时候, 通常是需要在 web.xml 中配置的, 比如配置 DispatcherServlet, 是通过对 URL 做映射实现的

    <servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.</url-pattern></servlet-mapping>

然后在 ${ servlet-name }-servlet.xml 中定义扫描 Controller 组件的包

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="package.controller, another.package"/><!-- ... --></beans>
这不免有些繁琐, 有没有更简单的方式呢?
有!, spring-webmvc 中提供了抽象类 `AbstractAnnotationConfigDispatcherServletInitializer`, 继承并实现它, 容器会自动实例化它!
在 Servlet 3.0 环境中,容器会在类路径中查找实现 javax.servlet.ServletContainerInitializer 接口的类,如果能发现的话,就会用它来配置 Servlet 容器。

Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现 WebApplicationInitializer 的类并将配置的任务交给它们来完成。

Just like this

package club.controller;import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;@ComponentScan(basePackageClasses = { IndexController.class }) // 为了方便重构, 这里并没有使用 @interface String[] value default {};
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {{// 会被两个上下文实例化System.out.println("WebApp init()");}@Overrideprotected Class<?>[] getRootConfigClasses() {return null;}// 返回的数组元素应该有 @ComponentScan 注解, 告诉 Spring 要扫描的控制器组件在哪里@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[] { this.getClass() };}// 要映射的 URL@Overrideprotected String[] getServletMappings() {return new String[] { "*.html" };}// 配置 Filter
}

当然, 上面的代码是简化了 WebConfig 类, 我们可以通过继承 WebMvcConfigurerAdapter 类, 然后标注 @Configuration 注解注入视图解析器等 bean, 或者重写方法,
就可以实现 MVC 的配置, 比如配置视图解析器, 配置静态资源的处理

    @Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[] { WebConfig.getClass() };}
package club.webinit;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.ViewResolver;import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;import club.controller.IndexController;@EnableWebMvc // 这个注解是必须的, 否则重写无效哦
@ComponentScan(basePackageClasses = { IndexController.class })
public class WebConfig extends WebMvcConfigurerAdapter{// 配置视图解析器// 顺便说一句,最好将JSP文件放在WEB-INF下作为视图,以隐藏它们直接访问(例如通过手动输入的URL)。 只有控制器才能访问它们。@Beanpublic ViewResolver getViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/Views/");resolver.setSuffix(".jsp");return resolver;}// 启用处理静态资源// 在 WebAppInitializer 中我们映射的 URL 是 "/", 如果 URI 匹配不到资源, 而默认的 Servlet 可以匹配到资源, 那就启用它@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}// 配置 Interceptor
}

参见 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/WebApplicationInitializer.html

转载于:https://www.cnblogs.com/develon/p/11483259.html

Spring WebAppInitializer without web.xml相关推荐

  1. Tomcat原理系列之四:Tomat如何启动spring(加载web.xml)

    Tomcat原理系列之四:Tomat如何启动spring 熟悉的web.xml ContextLoaderListener Tomcat的初始化StandardContext.startInterna ...

  2. Spring MVC的web.xml配置详解(转)

    出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name)  2.在 ...

  3. spring boot没有web.xml,如何向嵌入式的servlet容器中注册servlet组件

    1. Spring boot默认使用Tomcat作为嵌入式的servlet容器,只要引入spring-boot-starter-web依赖,就会默认用Tomcat作为servlet容器. 2. Spr ...

  4. java spring web配置文件路径_java – spring配置文件和web.xml的确切位置在哪里?

    从文档: Upon initialization of a DispatcherServlet, Spring MVC looks for a file named [servlet-name]-se ...

  5. spring struts hibernate web.xml配置文件模板

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  6. ssm(Spring+Spring mvc+mybatis)——web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...

  7. 集成spring框架的web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...

  8. Spring MVC之基于xml配置的web应用构建

    2019独角兽企业重金招聘Python工程师标准>>> 更多spring博文参考: http://spring.hhui.top/ 直接用SpringBoot构建web应用可以说非常 ...

  9. 03)java spi应用 java spring web项目 去除web.xml

    上一节 学习完了 原始 java web项目 无web.xml怎么配置servlet 这节学习 java web项目 无web.xml怎么集成spring框架 使用过web.xml集成spring框架 ...

  10. MAC OS X El CAPITAN 搭建SPRING MVC (1)- 目录、包名、创建web.xml

    一. 下载STS(Spring Tool Suite) 官方地址:http://spring.io/tools/sts 下载spring tool suite for mac 最新版本.这个IDE是很 ...

最新文章

  1. username is marked non-null but is null
  2. GDCM:寻找PatientRootQuery的测试程序
  3. java表数据去重_java8实现列表去重,java8的stream 和lambda的使用实例
  4. 详解TCP协议的服务特点以及连接建立与终止的过程(俗称三次握手四次挥手)
  5. win7硬盘安装工具_如何重装电脑安装Win7 系统?最简单,最便捷的办法,值得收藏...
  6. linux中如何改IP
  7. python未将对象引用设置到对象的实例_在Python中使用pingarapi。服务器引发Webfault:对象引用未设置为对象的实例...
  8. css中的伪类 之 first-child
  9. Java中设计模式之装饰者模式-3
  10. css各种字体英文名称
  11. 如何开发自己的VUE组件库并打包复用
  12. 企业微信--扫一扫功能(隐形坑)
  13. 华为服务器批量系统软件,华为云ECS批量管理工具
  14. 5g网速究竟有多快?比4g快多少?
  15. 前端实现图片快速反转替换_在canvas上实现元素图片镜像翻转动画效果的方法
  16. 全球10大智慧港口介绍
  17. 双十二投影仪推荐 三分钟告诉你怎么挑选到称心如意的投影仪
  18. SDL2.0--绘制文字
  19. 整数划分java_整数划分问题及其算法
  20. Mixly用点灯科技控制小爱同学小度小度天猫精灵Siri控制应用

热门文章

  1. 第四期coding_group笔记_用CRF实现分词-词性标注
  2. 火狐—火狐浏览器中的“HttpWatch”
  3. hibernate中uuid和native等主键生成策略
  4. 解决IIS出现“由于权限不足而无法读取配置文件”的问题
  5. CentOS安装MySQL及其使用(总结整理)
  6. 查找算法之四 斐波那契查找(C++版本)
  7. docker具名和匿名挂载
  8. 计算机图形学全代码,计算机图形学作业参考代码
  9. centos node 进程保护_NodeJs之进程守护
  10. vue echarts数据变化重新渲染_vue实例创建及数据挂载渲染