Spring:SpringServletContainerInitializer
ServletContainerInitializer
-
Servlet 3.0引入的接口,用于在web应用启动时动态添加servlet、filter和listener; - 基于
spi机制,META-INF/services/javax.servlet.ServletContainerInitializer文件中存放实现该接口的类,这些类会被容器调用; - 只能使用在
Jar文件中,不能使用在web项目中;
HandlesTypes
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
- 该注解申明的类,会被注入到
c中; - 如果没有合适的类,
c为null;
SpringServletContainerInitializer
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {
//...
}
}
-
SpringServletContainerInitializer为Spring中实现ServletContainerInitializer接口的唯一类; - 该类主要从容器获取实现
WebApplicationInitializer的类,并且按次序(javax.annotation.Priority)调用其onStartup方法
WebApplicationInitializer
public interface WebApplicationInitializer {
void onStartup(ServletContext servletContext) throws ServletException;
}
- 实现
WebApplicationInitializer接口的类会被Spring初始化; - 由于
Web项目中不能使用spi机制(未定位),所以如果需要动态添加servlet、filter和listener,就可以继承该接口,交由Spring初始化; - 实现该接口的类有:
-
AbstractContextLoaderInitializer:该抽象类无最终实现类,未仔细探究 -
AbstractDispatcherServletInitializer:继承AbstractContextLoaderInitializer
-
AbstractAnnotationConfigDispatcherServletInitializer:继承AbstractDispatcherServletInitializer
-
SpringBootServletInitializer:我在初次使用Spring boot的使用,对此抽象类很好奇。该类无Component修饰,说明不会被Spring探测到,那他是如何被初始化的,现在终于知道原因了。