Servlet
3.0添加了可插入性机制。它的工作方式是,在加载您的应用程序时,它将扫描类路径中名为
javax.servlet.ServletContainerInitializerinside
的文件
meta-INF/services。在这里,实现者应该具有实现的名称,servlet容器可以在其中加载它。您可以在
spring-webjar中看到此文件。它
org.springframework.web.SpringServletContainerInitializer列为初始化程序的实现。
Spring初始化程序的工作方式是,它
WebApplicationInializer由servlet容器传递所有的实现(在类路径上)。那么servlet容器如何知道传递这些实现?如果查看inializer的源代码,将会看到
@HandlesTypes(WebApplicationInitializer.class)public class SpringServletContainerInitializer implements ServletContainerInitializer {它是
@HandlesType注释。所有类 和
甚至注释1中列出的
@HandlesTypes将获得由servlet容器拾起,并传递到
SevletContainerInitializer通过一个回调方法参数
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
该
Set参数包含servlet容器在扫描时拾取的所有实现。您可以浏览源代码,以了解Spring对这些实现的作用。它基本上只是调用
onStartup所有inializer的,并传入
ServletContext。
1.这听起来有点不清楚(上面的解释在切线上可能有点偏离),所以我将其作为附加内容发布在这里。想象一下,
@HandlesType相反是
@HandlesTypes({WebApplicationInitializer.class, Controller.class})public class SpringServletContainerInitializer implements ServletContainerInitializer {这意味着servlet容器还将扫描用注释的类
@Controller,并将它们传递到
onStartupSpring初始化程序的。



