博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ServletContainerInitializer初始化器
阅读量:7257 次
发布时间:2019-06-29

本文共 2086 字,大约阅读时间需要 6 分钟。

在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。

一般伴随着ServletContainerInitializer一起使用的还有HandlesTypes注解,通过HandlesTypes可以将感兴趣的一些类注入到ServletContainerInitializerde的onStartup方法作为参数传入。

Tomcat容器的ServletContainerInitializer机制的实现,主要交由Context容器和ContextConfig监听器共同实现,ContextConfig监听器负责在容器启动时读取每个web应用的WEB-INF/lib目录下包含的jar包的META-INF/services/javax.servlet.ServletContainerInitializer,以及web根目录下的META-INF/services/javax.servlet.ServletContainerInitializer,通过反射完成这些ServletContainerInitializer的实例化,然后再设置到Context容器中,最后Context容器启动时就会分别调用每个ServletContainerInitializer的onStartup方法,并将感兴趣的类作为参数传入。

这里写图片描述

基本的实现机制如图,首先通过ContextConfig监听器遍历每个jar包或web根目录的META-INF/services/javax.servlet.ServletContainerInitializer文件,根据读到的类路径实例化每个ServletContainerInitializer;然后再分别将实例化好的ServletContainerInitializer设置进Context容器中;最后Context容器启动时分别调用所有ServletContainerInitializer对象的onStartup方法。

假如读出来的内容为com.seaboat.mytomcat.CustomServletContainerInitializer,则通过反射实例化一个CustomServletContainerInitializer对象,这里涉及到一个@HandlesTypes注解的处理,被它标明的类需要作为参数值传入到onStartup方法。如下例子:

@HandlesTypes({ HttpServlet.class,Filter.class }) public class CustomServletContainerInitializer implements     ServletContainerInitializer {
public void onStartup(Set
> classes, ServletContext servletContext) throws ServletException { for(Class c : classes) System.out.println(c.getName()); } }

其中@HandlesTypes标明的HttpServlet和Filter两个class被注入到了onStartup方法。所以这个注解也是需要在ContextConfig监听器中处理。前面已经介绍了注解的实现原理,由于有了编译器的协助,我们可以方便地通过ServletContainerInitializer的class对象中获取到HandlesTypes对象,进而再获取到注解声明的类数组,如

HandlesTypes ht =servletContainerInitializer.getClass().getAnnotation(HandlesTypes.class);Class
[] types = ht.value();

即可获取到HttpServlet和Filter的class对象数组,后面Context容器调用CustomServletContainerInitializer对象的onStartup方法时作为参数传入。至此,即完成了servlet规范的ServletContainerInitializer初始化器机制。

点击订购作者《Tomcat内核设计剖析》

你可能感兴趣的文章
算法——二分搜索
查看>>
Ruby Code Style
查看>>
CSS3深度学习
查看>>
将rm删除的文件,放到回收站
查看>>
JSTL安装与使用
查看>>
winSocket编程(十)完成端口
查看>>
POJ 1026 Cipher[置换]
查看>>
[链接]--Microsoft Dynamics CRM 2011 Web Resource简介
查看>>
织梦标签
查看>>
PHP 中如何使用 Mongodb
查看>>
JFinal
查看>>
Java 并行 (2): Monitor
查看>>
批量替换 MySQL 指定字段中的字符串
查看>>
First Django app(各个文件以及文件夹解析)
查看>>
iOS导航栏-导航栏透明
查看>>
iOS UITableView侧滑删除
查看>>
斯坦福 CS224n 中文笔记整理活动 | ApacheCN
查看>>
xcode 更新svn/Git后发现模拟器显示No Scheme问题
查看>>
[Hdu1693]Eat the Trees(插头DP)
查看>>
转行程序员深漂的这三年 #4
查看>>