【原始碼】spring boot
阿新 • • 發佈:2020-11-01
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); } } }