SpringSpring MVC及Spring Boot區別

1 前言

對於一個Java開發者來說,Spring可謂如雷貫耳,無論是Spring框架,還是Spring引領的IOC,AOP風格,都對後續Java開發產生的深遠的影響,同時,Spring社區總能及時響應開發者的需求,推出適應潮流發展的新功能特定;而對於大部分開發者而言,平時接觸最多的應該就是Spring MVC以及Spring Boot了,本文將分別對Spring,Spring MVC以及Spring Boot做總體概述,並分析闡述它們各自想要解決的問題,以便初學者能更好的瞭解Spring及相關概念


2 本篇結構

本篇將大致分為下列四個部分

  • 什麼是Spring?它解決了什麼問題?
  • 什麼是Spring MVC?它解決了什麼問題?
  • 什麼是Spring Boot?它解決了什麼問題?
  • Spring,Spring MVC,Spring Boot 三者比較


3 什麼是Spring?它解決了什麼問題?


我們說到Spring,一般指代的是Spring Framework,它是一個開源的應用程序框架,提供了一個簡易的開發方式,通過這種開發方式,將避免那些可能致使代碼變得繁雜混亂的大量的業務/工具對象,說的更通俗一點就是由框架來幫你管理這些對象,包括它的創建,銷燬等

,比如基於Spring的項目裡經常能看到的Bean,它代表的就是由Spring管轄的對象。

而在被管理對象與業務邏輯之間,Spring通過IOC(控制反轉)架起使用的橋樑,IOC也可以看做Spring最核心最重要的思想,通過IOC能帶來什麼好處呢?首先來看一個實際開發中的典型應用場景,假設我們有一個基於MVC分層結構的應用,通過controller層對外提供接口,而通過service層提供具體的實現,在service層中有一個WelcomeService服務接口,一般情況下都是通過WelcomeService service = new WelcomeServiceImpl();創建實例並進行調用:


<code>public class WelcomeController {    private WelcomeService service = new WelcomeServiceImpl();
    @RequestMapping("/welcome")    public String welcome() {    return service.retrieveWelcomeMessage();    }}
調用後發現一切正常,此時,功能提交,需要進行測試,而由於實際應用環境與測試環境有所區別,需要替換WelcomeServiceImpl為一個MockWelcomeServiceImpl,以方便測試,怎麼辦?沒有其他辦法,只有改代碼:
/<code>

<code>public class WelcomeController {    private WelcomeService service = new MockWelcomeServiceImpl();
    ...}/<code>

測試OK後再將代碼改回去,這種方式太過於繁瑣,且對代碼的侵入性很強;下面看通過Spring的IOC如何實現,首先將WelcomeService交由Spring管理:


<code>
然後在業務代碼處通過Spring IOC拿到具體對象:
/<code>

<code>public class WelcomeController {    @Autowired    private WelcomeService service;
    @RequestMapping("/welcome")    public String welcome() {        return service.retrieveWelcomeMessage();    }}/<code>

測試的時候,只需要更改配置文件,將WelcomeService對應的實現改為MockWelcomeServiceImpl即可:


<code>
這種方式對業務代碼沒有任何侵入,它有效的實現松耦合,大家都知道緊耦合的代碼是業務發展的噩夢;同時,Spring IOC提供的遠不止這些,如通過單例減少創建無用的對象,通過延遲加載優化初始化成本等
/<code>

當然,Spring 的核心功能遠不知這些,如:

  • Spring AOP
  • Spring JDBC
  • Spring MVC
  • Spring ORM
  • Spring JMS
  • Spring Test

其實不通過Spring框架依然可以實現這些功能特定,但是Spring 提供了更優雅的抽象接口以方便對這些功能的組裝,同時又給予每個具體實現以靈活的配置;另外,基於Spring,你可以方便的與其他框架進行集成,如hibernate,ibatis等,Spring官方的原則是絕不重複造輪子,有好的解決方案只需要通過Spring進行集成即可。縱覽Spring的結構,你會發現Spring Framework 本身並未提供太多具體的功能,它主要專注於讓你的項目代碼組織更加優雅,使其具有極好的靈活性和擴展性,同時又能通過Spring集成業界優秀的解決方案,想了解Spring的核心實現機制可參考tiny spring 項目。


4 什麼是Spring MVC?它解決了什麼問題?

Spring MVC是Spring的一部分,Spring 出來以後,大家覺得很好用,於是按照這種模式設計了一個 MVC框架(一些用Spring 解耦的組件),主要用於開發WEB應用和網絡接口,它是Spring的一個模塊,通過Dispatcher Servlet, ModelAndView 和 View Resolver,讓應用開發變得很容易,一個典型的Spring MVC應用開發分為下面幾步:首先通過配置文件聲明Dispatcher Servlet:


<code>    springmvc    com.qgd.oms.web.common.mvc.OmsDispatcherServlet            contextConfigLocation        /WEB-INF/applicationContext.xml        1
    springmvc    /
/<code>

通過配置文件聲明servlet詳情,如MVC resource,data source,bean等


<code>     
                                                                 
                                                                       
/<code>

若需添加其它功能,如security,則需添加對應配置:


<code>     
                                         /<code>

增加業務代碼,如controller,service,model等,最後生成war包,通過容器進行啟動。


5 什麼是Spring Boot?它解決了什麼問題?

初期的Spring通過代碼加配置的形式為項目提供了良好的靈活性和擴展性,但隨著Spring越來越龐大,其配置文件也越來越繁瑣,太多複雜的xml文件也一直是Spring被人詬病的地方,特別是近些年其他簡潔的WEB方案層出不窮,如基於Python或Node.Js,幾行代碼就能實現一個WEB服務器,對比起來,大家漸漸覺得Spring那一套太過繁瑣,此時,Spring社區推出了Spring Boot,它的目的在於

實現自動配置,降低項目搭建的複雜度,如需要搭建一個接口服務,通過Spring Boot,幾行代碼即可實現,請看代碼示例:

<code>//引入spring-boot-starter-web依賴
/<code>

<code>    org.springframework.boot    spring-boot-starter-web
//聲明Spring Boot應用,直接寫業務邏輯即可
/<code>

<code>@Controller@SpringBootApplicationpublic class MockServerApplication {    @RequestMapping("/hi")    @ResponseBody    String home() {        return "how are you!";    }
    public static void main(String[] args) {        SpringApplication.run(MockServerApplication.class, args);    }}/<code>

你甚至都不用額外的WEB容器,直接生成jar包執行即可,因為spring-boot-starter-web模塊中包含有一個內置tomcat,可以直接提供容器使用;基於Spring Boot,不是說原來的配置沒有了,而是Spring Boot有一套默認配置,我們可以把它看做比較通用的約定,而Spring Boot遵循的也是約定優於配置原則,同時,如果你需要使用到Spring以往提供的各種複雜但功能強大的配置功能,Spring Boot一樣支持

在Spring Boot中,你會發現你引入的所有包都是starter形式,如:

  • spring-boot-starter-web-services,針對SOAP Web Services
  • spring-boot-starter-web,針對Web應用與網絡接口
  • spring-boot-starter-jdbc,針對JDBC
  • spring-boot-starter-data-jpa,基於hibernate的持久層框架
  • spring-boot-starter-cache,針對緩存支持
  • 等等


Spring Boot對starter的解釋如下:

Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop-shop for all the Spring and related technology that you need, without having to hunt through sample code and copy paste loads of dependency descriptors. For example, if you want to get started using Spring and JPA for database access, just include the spring-boot-starter-data-jpa dependency in your project, and you are good to go

這句話的譯意為:

Starters是一系列極其方便的依賴描述,通過在你的項目中包含這些starter,你可以一站式獲得你所需要的服務,而無需像以往那樣copy各種示例配置及代碼,然後調試,真正做到開箱即用;比如你想使用Spring JPA進行數據操作,只需要在你的項目依賴中引入spring-boot-starter-data-jpa即可


6 Spring,Spring MVC,Spring Boot 三者比較

其實寫到這裡,很多讀者應該已經清楚,這三者專注的領域不同,解決的問題也不一樣;總的來說,Spring 就像一個大家族,有眾多衍生產品例如 Boot,Security,JPA等等。但他們的基礎都是Spring 的 IOC 和 AOP,IOC提供了依賴注入的容器,而AOP解決了面向切面的編程,然後在此兩者的基礎上實現了其他衍生產品的高級功能;Spring MVC是基於 Servlet 的一個 MVC 框架,主要解決 WEB 開發的問題,因為 Spring 的配置非常複雜,各種xml,properties處理起來比較繁瑣。於是為了簡化開發者的使用,Spring社區創造性地推出了Spring Boot,它遵循約定優於配置,極大降低了Spring使用門檻,但又不失Spring原本靈活強大的功能,下面用一張圖來描述三者的關係:

SpringSpring MVC及Spring Boot區別


Spring.png

一句話總結:Spring MVC和Spring Boot都屬於Spring,Spring MVC 是基於Spring的一個 MVC 框架,而Spring Boot 是基於Spring的一套快速開發整合包。


分享到:


相關文章: