1 介绍
严格讲ServletContainerInitializer(javax.servlet.ServletContainerInitializer)不是Spring的扩展点,而是web容器(jetty、tomcat)的扩展点,Springboot是基于这个扩展点来实现Servlet启动的。
ServletContainerInitializer从Serlet3.0开始支持,它是web容器在启动阶段提供给组件(这里将脱离于web容器的第三方框架统称组件,如Spring框架)的一个Hook点,组件可以在这里做初始化的工作(注册servlet、filter、listener)。借助ServletContainerInitializer web应用可以无xml(当然还有别的机制实现无xml,例如注解@WebServlet也可以注册servlet)。
组件如何使用ServletContainerInitializer?Servlet3.0规范要求组件必须在其jar包的META-INF/services目录中创建一个叫做 javax.servlet.ServletContainerInitializer 的文件,文件中指定ServletContainerInitializer的实现类。那么web容器在启动时就会通过jar services API发现并加载,调用其onStartup方法(如何调用?可以赏析jetty源码)。
说到ServletContainerInitializer,不得不说注解@HandlesTypes(javax.servlet.annotation.HandlesTypes)。ServletContainerInitializer.onStartup方法的第一个参数“Set<Class<?>> c”就是来自于@HandlesTypes。@HandlesTypes指定一些类(可以是注解类),所有继承/实现或被注解的类拼成一个Set传给ServletContainerInitia

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



