在spring中能夠經過代碼的方式配置原來的xml文件.在用java 代碼配置web.xml時候,spring文檔說配置類要實現WebApplicationInitializer接口.關於爲何要實現org.springframework.web.WebApplicationInitializer接口,記錄下.html
實際上是對servlet規範的一種使用.servlet早就支持用代碼實現相關的xml配置.java
servlet相關接口:web
ServletContainerInitializer spring
@HandlesTypes:api
解釋:實現了ServletContainerInitializer 接口的類在web程序啓動的時候會被容器掃描加載而且調用其onStartup方法(在方法中註冊servlet或者filters等web.xml中會進行的配置).可是實現此接口的類必須在某個jar包中的META-INF/services路徑下進行聲明(java spi).spring 中的實現類爲org.springframework.web.SpringServletContainerInitializer,該類在springweb jar包中聲明:oracle
@HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException { List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>(); if (webAppInitializerClasses != null) { for (Class<?> waiClass : webAppInitializerClasses) { // Be defensive: Some servlet containers provide us with invalid classes, // no matter what @HandlesTypes says... if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) { try { initializers.add((WebApplicationInitializer) waiClass.newInstance()); } catch (Throwable ex) { throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex); } } } } if (initializers.isEmpty()) { servletContext.log("No Spring WebApplicationInitializer types detected on classpath"); return; } servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath"); AnnotationAwareOrderComparator.sort(initializers); for (WebApplicationInitializer initializer : initializers) { initializer.onStartup(servletContext); } } }
SpringServletContainerInitializer上的註解:@HandlesTypes(WebApplicationInitializer.class)ide
意思是向該類注入HandlesTypes指定的類或者實現該接口的類.因此咱們通常實現WebApplicationInitializer,經過代碼註冊servlet就能夠使用了.post
因此流程是spring 中的SpringServletContainerInitializer onStartup()方法被容器調用,而後onStartup()方法最終調用的是咱們實現類中的方法.spa
參考servlet3.1規範code
spring-framework-reference
--
增長篇文章:http://stefan-isele.logdown.com/posts/201646 (2017年11月10日10:35:44)