ServletContainerInitializer初始化器
来源:互联网 发布:魔兽争霸mac无法打开 编辑:程序博客网 时间:2024/06/13 23:51
在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<Class<?>> 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
初始化器机制。
- ServletContainerInitializer初始化器
- Servlet3 ServletContainerInitializer与Spring Web
- ServletContainerInitializer源码翻译与理解
- java.lang.NoClassDefFoundError: javax/servlet/ServletContainerInitializer Jboss
- Servlet3.0研究之ServletContainerInitializer接口
- 初始化器初始化dictionary
- SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer
- 初始化器
- 初始化器
- 初始化器
- 对象初始化器和集合初始化器
- lambda 对象初始化器 集合初始化器
- 对象初始化器和集合初始化器
- 对象初始化器与集合初始化器
- 对象初始化器和集合初始化器
- c# 使用初始化器初始化对象
- JeeSite的开发环境部署 -- 异常:java.lang.ClassNotFoundException: javax.servlet.ServletContainerInitializer
- Tomcat8.x 中对ServletContainerInitializer接口的实现类的检测和自动调用
- JavaWeb之Servlet
- json的定义
- 什么是数据库事务?
- Reverse Bits
- EventBus理解
- ServletContainerInitializer初始化器
- 基于Phaser框架完成FlappyBird
- 连接数据库
- abs() 函数
- 单例模式
- Hdu 5749 Colmerauer
- POJ3250——Bad Hair Day(栈的应用)
- 373. Find K Pairs with Smallest Sums
- web项目总结