Spring,Spring boot和SpringMVC關係串想
Spring框架是一個大家族,再大的框架必然也是基於基礎,所以說到這三個概念之間的關係,我想先梳理一下近幾年java web專案開發框架的演變。
最初的靜態頁面以至於JSP這類技術暫不討論,大部分人都是servlet開始入門的。其實每個JSP頁面在執行的時候都會編譯成一個servlet類檔案,所以本質上JSP也是基於servlet的。
回憶一下最初是怎麼通過寫servlet開發web專案的,首先最重要的要有一個web.xml,web專案所有的請求url路由都會先到這個web.xml,現在的spring也是這樣,只不過spring中請求到了web.xml有更好的處理方式。而最初只寫servlet的話處理請求方法較為原始,需要在web.xml中配置好,一個servlet類對應一個請求,配置如圖:
很顯然servlet類是處理請求的關鍵,重寫三個方法init(),doFilter()和destroy(),如圖:
package demo; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class HelloFilter implements Filter { @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("Filter 初始化"); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; System.out.println("攔截 URI="+request.getRequestURI()); chain.doFilter(req, res); } @Override public void destroy() { System.out.println("Filter 結束"); } }
對應請求到了servlet類中後業務邏輯在doFilter()中處理,doFilter()返回型別是void,所以得在裡面寫跳轉或者直接通過往HttpservletResponse中塞東西返回,servlet是雙向有來有回的,最初大致是這樣。
這樣開發web專案的缺點很明顯,專案中有多少業務邏輯要處理就要寫多少servlet類檔案,還都要在web.xml中配置,太麻煩了,後來spring就來了。
spring是帶著AOP和IOC來的,但是解決上訴servlet開發問題的還是springMVC,只用spring的話還是有這個問題,這個暫且放一邊後面會有解釋。
先看看Spring有怎樣的革新,我們都知道web專案是可以分為三層的,即web層,service層和dao層。注意這三層很容易和springMVC的三層混淆,其實並沒有什麼關係要區分,SpringMVC其實就是一種Spring的Web層的解決方案,這也是為什麼上訴說SpringMVC真正解決了只用servlet開發問題。我理解的web層其實就是請求處理層,即請求是先到web層的,至於真正的業務處理還是在service層,dao層就不用說了,很多ORM框架例如Mybatis,Hibernate以及ibatis都是dao層解決方案。
從spring開始有了bean的概念,並且用Java Bean去管理bean。我們之前建立一個物件都是new出來的吧,而Spring可以將類作為bean配置在xml,類檔案上用@Bean註解就可以不用new來建立物件了,Spring容器可以自己去管理物件的建立並注入和物件的銷燬。再然後更方便了,也可以不用在xml中配置各種<bean>標籤了,直接通過不同型別的註解如@Component,@Respository,@Service,@Controller等標註在不同類上表示不同型別的bean。如上就是IOC了即控制反轉。至於AOP嘛大致就是切面程式設計暫且不論。到了,到這裡為止,只用Spring的話沒有解決之前說的servlet開發存在的請求路由問題,Spring的web層還是通過web.xml配置servlet類來匹配請求路由的,要想解決問題,這個時候就需要對web層使用解決方案了。
說道web層的解決方案,struts和SpringMVC就出現了,說白了SpringMVC就是對Spring的web層一個優化,至於SpringMVC的詳細介紹之前文章有,這裡就不贅述了。有了SpringMVC,web層的請求路由匹配問題就不需要大量寫servlet類也不需要大量配置了。
到這裡為止,web專案的開發框架已經比較成熟了,現在用的最多的還是Spring+SpringMVC+Mybatis。但是Spring+SpringMVC+Mybatis這種開發框架需要配置項還是很多啊,而且Spring是一個大家族,其他產品包括jpa,security等產品,如果想用他們又多了很多配置,就像用SpringMVC一樣,還是很麻煩啊,這個時候Spring Boot就來了。
我理解的Spring Boot就是一個不需要大量配置檔案就可以一鍋燉的產品大雜燴,有一個starter概念,其實就是個jar包,想用SpringMVC了,想用jpa了,想用security了,就把對應的starter配置一下就好了。Spring Boot有一句話叫做約定優於配置,即Spring Boot不需要配置是因為很多配置項都是預設配置好的,當然你可以改。比如在Spring Boot中看不到SpringMVC的前端控制器,檢視解析器包括處理器對映器介面卡這些配置,都是封裝配置好的,你當然可以重新配置。Spring Boot不但繼承了Spring大家族中的產品,包括Tomcat也整合進去了,Spring Boot的專案打成了一jar丟到伺服器中就可以跑,甚至不需要在伺服器中裝Tomcat。
最後總結一下,如果非要來個大小關係的話,Spring Boot > Spring > Spring MVC。