SPRING BOOT是如何實現自動初始化的?

原由

今天看spring boot的源碼,想找一下filter是如何經過註解自動啓動的,結果就找到了ServletContainerInitializer類。因而真想大白,就是這貨讓spring boot實現了自動初始化的。 java

規範

servlet規範規定,在容器啓動時,會經過ServletContainerInitializer的實現類來作初始化的工做。
具體使用方法爲:
1.實現ServletContainerInitializer接口。
2.在jar包的META-INF/services目錄建立一個名爲javax.servlet.ServletContainerInitializer的文件。
3.ServletContainerInitializer文件內容爲實現類的全類名(即包名+類名)。 git

Spring boot中的實現類

下邊是spring boot中相關的實現類
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的結構以下:
SPRING BOOT是如何實現自動初始化的?ide

你們可能注意到了,在SpringServletContainerInitializer有@HandlesTypes(WebApplicationInitializer.class)的註解,此註解的做用是將WebApplicationInitializer.class做爲參數傳入onStartup中。code

源碼存放在了github上,方便你們查看。blog

https://github.com/feelgood3000/ServletContainerInitializer
相關文章
相關標籤/搜索