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
探测到,那他是如何被初始化的,现在终于知道原因了。
SpringBootServletInitializer