1. 程式人生 > 實用技巧 >【原始碼】spring boot

【原始碼】spring boot

springboot

1.沒有web.xml,tomcat和spring是如何關聯的?

Servlet3.0規範,可以通過java配置(註解等)省去web.xml配置。3.0規範,容器啟動時會去專案根目錄下的META-INF/services下找javax.servlet.ServletContainerInitializer這個檔案。容器啟動後會載入這個檔案中的類(必須要實現ServletContainerInitializer),springboot在這個檔案中配置了SpringServletContainerInitializer,web容器啟動後,呼叫所有實現WebApplicationInitializer的onStartup方法--(SpringBootServletInitializer)。在這個SpringBootServletInitializer的onStartup方法中,啟動了整個Spring容器。容器啟動時會根據配置類WebMvcAutoConfiguration將配置類註冊進去。
(在本地除錯時使用SpringApplication.run來手動啟動容器)

/**
* @HandlesTypes這個註解標明瞭該ServletContainerInitializer需要在啟動時候處理哪些類,
然後伺服器會把找到的這些類傳到onStartup的第一個引數裡

注意這裡的類包括所配置類的子類,比如這裡配置WebApplicationInitializer,
啟動之後,就會把這個WebApplicationInitializer的子類都傳進去
*/
@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>();

        //.... 省略容錯的一些程式碼
        initializers.add((WebApplicationInitializer) waiClass.newInstance());
        //.... 
    AnnotationAwareOrderComparator.sort(initializers);
        for (WebApplicationInitializer initializer : initializers) {
            initializer.onStartup(servletContext);
        }
    }

}