1. 程式人生 > >Spring,Spring boot和SpringMVC關係串想

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。