今天看spring boot的源碼,想找一下filter是如何經過註解自動啓動的,結果就找到了ServletContainerInitializer類。因而真想大白,就是這貨讓spring boot實現了自動初始化的。 java
servlet規範規定,在容器啓動時,會經過ServletContainerInitializer的實現類來作初始化的工做。
具體使用方法爲:
1.實現ServletContainerInitializer接口。
2.在jar包的META-INF/services目錄建立一個名爲javax.servlet.ServletContainerInitializer的文件。
3.ServletContainerInitializer文件內容爲實現類的全類名(即包名+類名)。 git
下邊是spring boot中相關的實現類
github
實現類不少,咱們查看SpringServletContainerInitializer的源碼來了解具體實現。web
package org.springframework.web; @HandlesTypes(WebApplicationInitializer.class) public class SpringServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException { //其餘初始化代碼 //容器啓動時,會調用這裏邊的代碼,給spring boot執行初始化代碼的機會 } }
javax.servlet.ServletContainerInitializer的內容:spring
org.springframework.web.SpringServletContainerInitializer
spring-web-4.3.13.RELEASE.jar的結構以下:
ide
你們可能注意到了,在SpringServletContainerInitializer有@HandlesTypes(WebApplicationInitializer.class)的註解,此註解的做用是將WebApplicationInitializer.class做爲參數傳入onStartup中。code
源碼存放在了github上,方便你們查看。blog
https://github.com/feelgood3000/ServletContainerInitializer