常规容器下SpringBootServletInitializer如何实现web.xml作用解析
来源:互联网 发布:网络编程看什么书 编辑:程序博客网 时间:2024/05/18 12:28
在之前的《使用jsp作为视图模板&常规部署》章节有过一个实践,需要启动类继承自SpringBootServletInitializer方可正常部署至常规tomcat下,其主要能够起到web.xml的作用。下面通过源码简单解析为何其能够替代web.xml。
本章概要
1、源码分析如何实现SpringBootServletInitializer整个加载过程;
2、实现自定义WebApplicationInitializer配置加载;
3、实现自定义ServletContainerInitializer 配置加载;
示例代码如下
1、首先web.xml主要配置各种servlet,filter,listener等,如常见的Log4jConfigListener、OpenSessionInViewFilter、CharacterEncodingFilter、DispatcherServlet等,此部分信息均是容器启动时加载。
2、在springboot中我们从SpringBootServletInitializer源码入手:
可以先关注此类实现了WebApplicationInitializer,那么实现了此接口又如何呢?
3、下面继续关注一个spring源码:
4、继续关注3中红色标示部分,此时我们先来看ServletContainerInitializer的作用,其主要就是在启动容器时负责加载相关配置:
public abstract interface ServletContainerInitializer {
public abstract void onStartup(Set<Class<?>> paramSet, ServletContext paramServletContext) throws ServletException;
}
容器启动时会自动扫描当前服务中ServletContainerInitializer的实现类,并调用其onStartup方法,其参数Set<Class<?>> c,可通过在实现类上声明注解javax.servlet.annotation.HandlesTypes(WebApplicationInitializer.class)注解自动注入,@HandlesTypes会自动扫描项目中所有的WebApplicationInitializer.class的实现类,并将其全部注入Set。
5、通过4中的说明可以很清楚的理解其服务启动容器加载过程配置的装载过程,在SpringServletContainerInitializer中可以发现所有WebApplicationInitializer实现类在执行onStartup方法前需要根据其注解@order值排序,下面自定义一个WebApplicationInitializer实现类:
打成WAR包部署至常规tomcat下启动服务验证:
注:之前有专门讲解如何装载servlet、filter、listener的注解,且可以通过两种不同的方式。那么第三种方式可以通过WebApplicationInitializer的实现类来进行装载配置。但此方式仅限部署至常规容器下生效,采用jar方式应用内置容器启动服务不加载。
6、既然可以通过自定义的WebApplicationInitializer来实现常规容器启动加载,那么我们是否可以直接自定义ServletContainerInitializer来实现启动加载配置呢:
6.1、首先编写一个待注册的servlet:
6.2、编写实现ServletContainerInitializer的自定义实现类:
6.3、对新增的servlet设置其请求路径,同时打成WAR包部署至tomcat启动服务,但请求http://localhost:8080/SpringBoot1/servlet4却失败,此时发现需要了解servlet3对于ServletContainerInitializer 的加载机制是如何的,在官方有类似这样的描述“该接口的实现必须声明一个JAR资源放到程序中的META-INF/services下,并且记有该接口实现类的全路径,才会被运行时(server)的查找机制或是其它特定机制找到”。那么我们先参考spring-web-4.3.2.RELEASE.jar中
我们可以将自定义的类配置到一个jar包下部署至WEB-INF\lib目录下,
6.3.1、首先新建如下目录结构的文件并填写内容如下:
6.3.2、然后通过如下命令生成jar包
6.3.3、将myTest.jar放置WEB-INF\lib目录下重启服务,再次请求:
注:与5中实现WebApplicationInitializer一样,该方式仅限于部署常规容器生效。故jar通过内置容器启动的服务无法加载servlet4配置。
http://blog.csdn.net/songhaifengshuaige/article/details/54138023
阅读全文
0 0
- 常规容器下SpringBootServletInitializer如何实现web.xml作用解析
- 常规容器下SpringBootServletInitializer如何实现web.xml作用解析
- Web容器配置文件web.xml解析
- 两个WEB.XML:servlet容器中的web.xml和WEB-INF下的web.xml
- Web容器的作用
- web容器加载xml
- 如何在web.xml里配置spring容器
- java解析xml模拟容器的实现 如spring等
- 配置web.xml和glassfish容器实现javaEE表单验证
- Tomcat conf目录下web.xml,tomcat-users.xml,server.xml以及context.xml的作用
- Tomcat conf目录下web.xml,tomcat-users.xml,server.xml以及context.xml的作用
- Tomcat conf目录下web.xml,tomcat-users.xml,server.xml以及context.xml的作用
- 详谈 tomact conf 目录下 web.xml tomact-users.xml server.xml context.xml 作用
- web.xml的作用
- web.xml作用
- web.xml的作用
- web.xml的作用
- web.xml 作用
- java的类之间的关系:泛化、依赖、关联、实现、聚合、组合
- java后台书单
- JVM类加载过程
- bzoj2827千山鸟飞绝(Treap)
- 欢迎使用CSDN-markdown编辑器
- 常规容器下SpringBootServletInitializer如何实现web.xml作用解析
- 创建Hibernate项目的步骤
- Android png转xml
- 【转】深入理解Java内存模型5.锁
- 算法之旅 | 冒泡排序法
- Web挖掘技术
- 【Codeforces226E】Noble Knight's Path
- MIT波士顿咨询联合报告:超过半数的企业都完全没用上AI
- 百度总裁张亚勤:ABC的融合将大幅提升IT产业,改造传统行业