1、WebApplicationInitializer

现在Java配置方式在逐渐取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代,它是一个接口。通过实现WebApplicationInitializer,在其中可以添加servlet,listener等,在加载Web项目的时候会加载这个接口实现类,从而起到web.xml相同的作用。下面就看一下这个接口的详细内容。

public interface WebApplicationInitializer {void onStartup(ServletContext servletContext) throws ServletException;
}

我们现在看一下WebApplicationInitializer的官方描述

public interface WebApplicationInitializer

Interface to be implemented in Servlet 3.0+ environments in order to configure the ServletContext programmatically -- as opposed to (or possibly in conjunction with) the traditional web.xml-based approach.

Implementations of this SPI will be detected automatically by SpringServletContainerInitializer, which itself is bootstrapped automatically by any Servlet 3.0 container. See its Javadoc for details on this bootstrapping mechanism.


在Servlet 3.0+环境中实现的接口,以便以ServletContext编程方式配置 -与传统的web.xml基于方法的方法相反(或可能与之结合)。

会自动检测SPI的实现SpringServletContainerInitializer,它本身会被任何Servlet 3.0容器自动引导。有关此自举机制的详细信息。

参见:WebApplicationInitializer (Spring Framework 5.3.11 API)

感觉现在好像看不出什么东西现在我们先去看一下实现的类:SpringServletContainerInitializer

/**搜集实现了WebApplicationInitializer的类并且注入到set集合*/
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {/*** @param webAppInitializerClasses 搜集到的子类集合* @param servletContext 需要初始化的上下文* @throws ServletException*/@Overridepublic void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)throws ServletException {//子类集合List<WebApplicationInitializer> initializers = new LinkedList<>();if (webAppInitializerClasses != null) {for (Class<?> waiClass : webAppInitializerClasses) {// Be defensive: Some servlet containers provide us with invalid classes,// no matter what @HandlesTypes says...if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&WebApplicationInitializer.class.isAssignableFrom(waiClass)) {try {//把通过反射创建的子类添加到集合initializers.add((WebApplicationInitializer)ReflectionUtils.accessibleConstructor(waiClass).newInstance());}catch (Throwable ex) {throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);}}}}if (initializers.isEmpty()) {servletContext.log("No Spring WebApplicationInitializer types detected on classpath");return;}servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");AnnotationAwareOrderComparator.sort(initializers);for (WebApplicationInitializer initializer : initializers) {//调用子类onStartupinitializer.onStartup(servletContext);}}}

当tomcat的SPI机制扫描并且实例化这个SpringServletContainerInitializer时,发现这里实现了servlet SPI标准接口,这里会自动扫描我们的jar包和工程里面实现了WebApplicationInitializer的类,在SpringServletContainerInitializer实例化的时候会自动把实现了WebApplicationInitializer的类添加到这个set集合。

如果说我们实现了这个标准 ServletContainerInitializer ,Tomcat在启动的时候,SPI机制在实例化这个HandlesTypes(搜集指定类的实现或者子类)机制的时候发现实现了这个ServletContainerInitializer 接口那么它一定会调用它的onStartup方法。

这里补充一点Tomcat的SPI机制扫描的是工程及jar下面有没有一个META-INF/services目录,目录下面有没有这么一个全限定名的SPI文件。

文件名和里面的全限定名必须一样否则不会生效,找到之后并且实例化。


2、WebApplicationInitializer简化web.xml配置

对于Spring MVC的DispatcherServlet配置方式,传统的是基于XML方式的。如下:

<servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>springMVC</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

现在我们通过WebApplicationInitializer简化,我们先看下面代码

public class MyWebApplicationInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletCxt) {// Load Spring web application configurationAnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();ac.register(AppConfig.class);ac.refresh();// Create and register the DispatcherServletDispatcherServlet servlet = new DispatcherServlet(ac);ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);registration.setLoadOnStartup(1);registration.addMapping("/app/*");}
}@Configuration
@ComponentScan(value = "cn.enjoy")
public class AppConfig {
}

上面我们也说了这个WebApplicationInitializer 的作用了这里就不作描述了,我们可以在onStartup这个方法里进行容器初始化、servlet定义以及监听器的处理等等。可以根据情况在这里面进行逻辑处理,

记住上面所述的这里的onStartup方法是一定会被SpringServletContainerInitializer所搜集到并且调用它的onStartup方法。


3、AbstractAnnotationConfigDispatcherServletInitializer

上面我们描述了通过WebApplicationInitializer替换web.xml配置。但是SpringMvc提供一个抽象类AbstractAnnotationConfigDispatcherServletInitializer,我们可以通过这个类快速开发,比上面更为简便。

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {//父容器@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[]{SpringContainer.class};}//SpringMVC配置子容器@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[]{MvcContainer.class};}//获取DispatcherServlet的映射信息@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

这个类的最顶层其实还是基于WebApplicationInitializer实现,只不过中间的具体实现交给Spring。

如图所示,我们通过AbstractAnnotationConfigDispatcherServletInitializer可以只需配置父子容器以及路径映射,至于容器初始化以及监听器全部交由Spring处理。

根据上面描述就可以达到Spring零配置效果了。

由于理解有限、如有什么错误的地方请留言。

SpringMvc零配置,无Web.xml相关推荐

  1. spring整合hibernate的applicationContext.xml文件配置以及web.xml

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

  2. SpringMVC是如何消灭web.xml后还能加载到DispatchServlet的流程

    SpringMVC能做到不需要web.xml是利用了Servlet3.0的新特性 涉及到的Servlet 3.0新特性 1.ServletContext 对象的功能进行了加强,支持在运行时动态部署 S ...

  3. springMVC去除web.xml的依赖

    源于蚂蚁课堂的学习,点击这里查看 1.servlet去除web.xml 众所周知,springMVC是指servlet基础上做了一层包装,所以在此之前,我们了解一下servlet如何去除web.xml ...

  4. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  5. web.xml文件中可以配置哪些内容?

    web.xml用于配置Web应用的相关信息,如:监听器(listener).过滤器(filter).Servlet.相关参数. 会话超时时间.错误页面等①配置Spring上下文加载监听器,加载Spri ...

  6. jsp连接servlet配置web.xml

    jsp连接servlet配置web.xml 两种方法 第一种:建立jsp文件,servlet文件,配置web.xml文件. 第二种:建立jsp文件,servlet文件. 首先介绍第一种: 打开ecli ...

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

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

  8. SpringMvc框架配置过滤器

    SpringMvc框架配置过滤器 本文以简单的登录过滤器为例 开发环境 jdk 8 idea2019.3.5 maven 3.6.3 spring-webmvc 5.1.9.RELEASE web.x ...

  9. Spring揭秘--寻找遗失的web.xml

    今天我们来放松下心情,不聊分布式,云原生,来聊一聊初学者接触的最多的 java web 基础.几乎所有人都是从 servlet,jsp,filter 开始编写自己的第一个 hello world 工程 ...

最新文章

  1. JGG:青岛大学苏晓泉团队利用条件致病菌指数评估环境微生物风险
  2. ObservableCollection和List的区别总结
  3. 实用ExtJS教程100例-006:ExtJS中Window的用法示例
  4. 【存储知识学习】第十章- 存储架构演进过程《大话存储》阅读笔记
  5. MemCached缓存知识知多少?
  6. 关于现代软件工程学习
  7. why my filter by titleID does not work
  8. mysql ext_RHEL5+postfix+mysql+extmai(源代码)(一)
  9. arcgis 经纬度转大地坐标_【干货】坐标系统与投影变换及在ArcGIS中的应用
  10. Spyder IDE中使用git
  11. VUE组件封装echarts百度地图点位效果
  12. 恩尼格玛模拟器_使用ENIGMA模拟器进行数据加密和解密
  13. 抖音很火的计算机音乐,抖音最近很火的几首背景音乐(BGM),推荐给大家很好听...
  14. Baltimore System of Classifications of Viruses
  15. 网络基础 — IP地址和子网掩码
  16. HTML图片和文字一行时的对齐方式
  17. Kryo:快速、高效的序列化框架
  18. Anaconda安装
  19. hdu 2550百步穿杨
  20. 数字电子技术-组合逻辑电路

热门文章

  1. chrome卸载之后再安装无法成功
  2. 如何卸载Chrome应用程序
  3. JavaScript输出杨辉三角形
  4. 【Intel汇编指令集】寄存器
  5. 初学爬虫-翻译软件爬虫
  6. 计算机组成原理与编语言程序设计(第四版)178页4-19题:在实例模式下,假设(DS)=1234H,(SI)==124H,(12464H)=30ABH,(12484H)=464H,有以下程序
  7. 微型计算机技术段地址,微型计算机技术-中国大学mooc-题库零氪
  8. Android OMX详解
  9. DB2数据库设置归档模式
  10. 物联网前景广阔 但美国断网事件敲响安全警钟