springBoot零配置原理與內嵌tomcat原理

一、使用傳統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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章