一、使用傳統springMVC“必要”的配置:
1.配置web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 初始化spring環境-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
2.配置applicationContext.xml
//掃描業務類
<context:component-scanbase-package="com.service" />
3.配置spring-mvc.xml
//掃描控制器類
<context:component-scan base-package="com.controller" />
總結:一個傳統的spring-mvc(不考慮db與其他中間件等)必要配置爲初始化spring環境、前端控制器配置、掃描業務類配置、掃描控制器類配置,一共4個必要的配置,那麼如果我們能通過註解or代碼來替代上面4個必要的配置的話,就可以做到零配置
二、springBoot零配置:
https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html
官網的示例,上面那段代碼便可以替代傳統的springMVC配置,WebApplicationInitializer類便可替代web.xml,只需要在web應用服務器啓動的時候調用spring的初始化並調用該類的onStartup方法即可
三、springBoot如何把Servlet註冊給tomcat或web容器對象:
1.通過web.xml方式配置
2.通過@webServlet註解
3.通過tomcat對象的addServlet方法
springBoot明顯不可能採用前面兩種,通過第三種便需要內嵌tomcat
四、springBoot如何內嵌tomcat:
1.通過maven依賴引入tomcat
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.33</version>
</dependency>
2.代碼啓動tomcat
Tomcat tomcat = new Tomcat();
tomcat.setPort(9980);
try{
tomcat.start();
tomcat.getServer().await();
}catch(LifecyleException e){
e.printStackTrace();
}
醬紫就可以啓動內嵌tomcat了,但是要初始化spring環境與springMVC配置還需要tomcat在啓動的時候調用WebApplicationInitializer的onStartup方法,如何能實現呢?即如何能讓tomcat在不依賴spring的前提下,啓動的時候調用WebApplicationInitializer的onStartup方法
答案是servlet 3.0 + java的SPI機制。從servlet3.0開始,web容器啓動時爲提供給第三方組件機會做一些初始化的工作,例如註冊servlet或者filtes等,servlet規範中通過ServletContainerInitializer實現此功能。spring實現了servlet 3.0的標準,通過對ServletContainerInitializer接口進行了實現SpringServletContainerInitializer,並且在spring-web-x.x.x-RELEASE.jar的META-INF/services目錄創建一個名爲javax.servlet.ServletContainerInitializer的文件,指定了具體實現爲org.springframework.web.SpringServletContainerInitializer,配合註解@HandlesTypes它可以將其指定的Class對象作爲參數傳遞到onStartup方法中。進而在onStartup方法中獲取Class對象的具體實現類,進而調用實現類中的具體方法。SpringServletContainerInitializer類中@HandlesTypes指定的是Class對象是WebApplicationInitializer。因此,若實現WebApplicationInitializer這個接口,我們就可以自定義的注入Servlet,或者Filter等等,即可以不再依賴web.xml的配置,tomcat也無需依賴spring