spring講解一:爲什麼tomcat可以運行SpringMvc項目?對比使用純java代碼 和 純xml配置,如何啓動SpringMvc項目。

爲什麼tomcat會調用java代碼?tomcat和java代碼是兩個獨立的個體,他們如何最後達到tomcat可以運行java代碼的呢? 爲什麼tomcat運行的是Springmvc項目的代碼?爲什麼現在的項目都離不開Springmvc?爲什麼不直接運行一個隨意的main方法?爲什麼web應用框架有Springmvc和Struts2 ?  Springmvc和Struts2有什麼共同點? 不知道答案的其實可以先猜一下試試。

答案:Servlet的規範,也可以說成是Servlet協議。


以前web項目都是必須用xml做配置,達到項目運行的效果,爲什麼現在可以不使用xml了?

答案:Servlet3.0的規範,2.5或者是以前的版本是不可以的,2.5版本以前,規定項目必須使用web.xml配置方式來運行代碼。


爲什麼tomcat運行的是Springmvc項目的代碼?沒有隨便運行一個main方法的代碼?

答案:因爲Springmvc框架遵守了Servlet規範,其中一條規範規定,在代碼的根目錄中(以spring框架爲例,springmvc提供的jar包spring-web),必須有一個叫META-INF/services的目錄且裏面有一個全類路徑名的文件(文件內容很簡單:就是一個自定義的啓動的類的全類名),而這個類中呢,必須有一個方法,名字叫:onStartup

到了這個時候,其實就明白了,原來tomcat啓動,是直接去代碼根目錄找一個文件,然後根據文件裏的內容,找到一個類,再運行這個類的一個叫onStartup方法,然後代碼就開始一層一層的開始往下運行了。

其實不要springmvc也是可以的,不過就需要自己重新實現servlet的具體功能,對於開發來說,太麻煩,而且功能不一定能實現的這麼全,這麼好。

大家應該還記得,最開始學習java的時候,那時候的web項目可以說是非常的複雜,但是能夠讓你知道具體實現原理,現在框架封裝太厚,如果想要了解,就算費盡九牛二虎之力,都不一定能清楚原理。特別是現在的springboot框架,用起來更加簡單,但是很多原理幾乎都隱藏了起來,但是萬惡的面試官就喜歡問一些,對開發不太起作用的問題。

言歸正傳,以前的項目springmvc+spring+hibernate/mybaits項目,WEB-INF目錄下有個web.xml文件

在spring3框架之前用的是Servlet3.0之前的規範,onStartup方法必須讀取web.xml中的配置,進行初始化,spring3以後,就開始使用Servlet3.0規範,允許使用JavaConfig的方式(純代碼的方式),以前寫在web.xml中內容,現在直接在onStartup方法中new,進行初始化,以前的名叫springmvc.xml、applicationContext-redis.xml類似這種名稱的配置,現在直接用註解標記一個自定義的類,寫好初始化的代碼,就可以代替以前的配置文件了。

如果還記得web.xml的話,應該見過下面一段配置

<servlet>
    <servlet-name>springmvc_mybatis_annotation</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

裏面有段配置:classpath:springmvc/springmvc.xml,就是說,運行onStartup方法後,遇到了new的DispatcherServlet後,就開始去找springmvc.xml這個文件,又再去初始化spring的其他集成配置。

現在springboot都不需要了,他把日常開發中,需要的配置,都幫你在springboot框架的java代碼中寫好了,程序員基本不用改了。

但是如果你想要改,不好意思,你又要去看springboot提供的官方文檔(文檔裏有教你怎麼集成redis、mysql等很多常用的組件),或者百度。

所以,如果你不想單純的做一個碼農,這個東西,你就必須要去了解。


爲什麼web應用框架有Springmvc和Struts2 ? 他們有什麼共同點 ?

答案:因爲他們兩個web應用層框架都遵守了Servlet規範,他們都有相同的META-INF/services目錄,都有自己實現的onStartup方法。他們都是封裝了javax提供的servlet-api。也就是他們的底層都是servlet實現的。


 

其他解釋:Servlet3.0的規範,是基於SPI的機制來實現的,

SPI ,全稱爲 Service Provider Interface,是一種服務發現機制。它通過在ClassPath路徑下的META-INF/services文件夾查找文件,自動加載文件裏所定義的類。這一機制爲很多框架擴展提供了可能,比如在Dubbo、JDBC中都使用到了SPI機制。

說簡單點,就是我規定你,下午3點在停車場的3號車位來接我,我下午3點會過來乘車。就兩邊都說好了,然後我們就可以進行交互了。

我們都知道,運行web項目,不光光是tomcat可以運行,還有weblogic、jetty、jboos等web容器(可以叫做web服務器)),因爲tomcat免費,且性能還不錯,所以被廣泛運用。那爲什麼這些web服務器,就可以是web服務器了呢?那我隨便寫段代碼爲什麼就成不了web服務器?

這裏也就牽扯到Servlet其中的規範,也就是說,你要開發web服務器你要聽我的,你要寫web項目也必須聽我的:

1. 你如果是運行java代碼的web服務器(例:tomcat)運行之後,必須去代碼的根目錄下找META-INF/services文件夾並找到文件中的代碼,運行代碼中的onStartup方法。

2. “你”(例:springmvc框架)的代碼想被唄運行,就必須有一個META-INF/services文件夾,和自己實現的onStartup的方法。


 

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