publiccms多站点下静态资源获取过程(war外部web容器启动方式)
原理:
1.在servlet 3.0+ 中,可以以 Code-based Approach 方式动态取代 以前 web.xml方式的配置,如配置 servlet, filter, listener.
为了支持可以不使用web.xml。提供了ServletContainerInitializer,它可以通过SPI(Serial Peripheral Interface)机制。
SPI机制使用:
1.当启动web容器的时候(eg:tomcat容器),会自动到添加的相应jar包下找到META-INF/services下以ServletContainerInitializer的全路径名称命名的文件;
2.它的内容为ServletContainerInitializer实现类的全路径,并将它们实例化。
3.既然这样的话,那么SpringServletContainerInitializer作为ServletContainerInitializer的实现类,它的jar包下也应该有相应的文件。
如:spring-web-4.3.7.RELEASE.jar 包下的/META-INF/services/javax.servlet.ServletContainerInitializer 就存在了一个SPI,其内容为 对ServletContainerInitializer实现类的全路径:org.springframework.web.SpringServletContainerInitializer
4.对ServletContainerInitializer的实现类SpringServletContainerInitializer分析:
@HandlesTypes({WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer { //实现ServletContainerInitializer接口,用于取代web.xml编写。
public SpringServletContainerInitializer() {}
@Override
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {