Spring、Spring Boot與Spring MVC

總論

Spring框架就像一個家族,有衆多衍生產品例如boot、security、jpa等等。但他們的基礎都是Spring的ioc和aop。ioc提供了依賴注入的容器,aop解決了面向橫切面的編程;而後在此兩者的基礎上實現了其餘延伸產品的高級功能。css

Spring MVC是基於 Servlet 的一個 MVC 框架,主要解決 WEB 開發的問題。html

後來由於 Spring 的配置很是複雜,各類XML、 JavaConfig處理起來比較繁瑣。因而爲了方便開發者使用,從而又推出了Spring BOOT,簡化了Spring的配置流程。git

說得更簡便一些:Spring 最初利用「工廠模式」(DI)和「代理模式」(AOP)解耦應用組件。你們以爲挺好用,因而按照這種模式搞了一個MVC框架(一些用Spring解耦的組件),用來開發web應用,最終造成了SpringMVC。而後有發現每次開發都寫不少樣板代碼,爲了簡化工做流程,因而開發出了一些「懶人整合包」(starter),這套就是 Spring BOOT。github

Spring MVC的功能

Spring MVC提供了一種輕度耦合的方式來開發web應用。web

Spring MVC是Spring的一個模塊,一個web框架。經過Dispatcher Servlet、ModelAndView 和 View Resolver,開發web應用變得很容易。解決的問題領域是網站應用程序或者服務開發——URL路由、Session、模板引擎、靜態Web資源等等。spring

Spring BOOT的功能

Spring Boot實現了自動配置,下降了項目搭建的複雜度。express

衆所周知Spring框架須要進行大量的配置,Spring Boot引入自動配置的概念,讓項目設置變得很容易。Spring Boot自己並不提供Spring框架的核心特性以及擴展功能,只是用於快速、敏捷地開發新一代基於Spring框架的應用程序。也就是說,它並非用來替代Spring的解決方案,而是和Spring框架緊密結合用於提高Spring開發者體驗的工具。同時它集成了大量經常使用的第三方庫配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot應用中這些第三方庫幾乎能夠零配置的開箱即用(out-of-the-box),大部分的Spring Boot應用都只須要很是少許的配置代碼,使開發者可以更加專一於業務邏輯。apache

Spring Boot只是承載者,輔助你簡化項目搭建過程的。若是承載的是WEB項目,使用Spring MVC做爲MVC框架,那麼工做流程和你上面描述的是徹底同樣的,由於這部分工做是Spring MVC作的而不是Spring Boot。編程

對使用者來講,換用Spring Boot之後,項目初始化方法變了,配置文件變了,另外就是不須要單獨安裝Tomcat這類容器服務器了,maven打出jar包直接跑起來就是個網站,但你最核心的業務邏輯實現與業務流程實現沒有任何變化。緩存

因此,用最簡練的語言歸納就是:

Spring 是一個「引擎」;

Spring MVC 是基於Spring的一個 MVC 框架 ;

Spring Boot 是基於Spring4的條件註冊的一套快速開發整合包。

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

咱們說到Spring,通常指代的是Spring Framework,它是一個開源的應用程序框架,提供了一個簡易的開發方式,經過這種開發方式,將避免那些可能導致代碼變得繁雜混亂的大量的業務/工具對象,說的更通俗一點就是由框架來幫你管理這些對象,包括它的建立,銷燬等,好比基於Spring的項目裏常常能看到的Bean,它表明的就是由Spring管轄的對象。

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

public class WelcomeController {
    private WelcomeService service = new WelcomeServiceImpl();

    @RequestMapping("/welcome")
    public String welcome() {
    return service.retrieveWelcomeMessage();
    }
}複製代碼

調用後發現一切正常,此時,功能提交,須要進行測試,而因爲實際應用環境與測試環境有所區別,須要替換WelcomeServiceImpl爲一個MockWelcomeServiceImpl,以方便測試,怎麼辦?沒有其餘辦法,只有改代碼:

public class WelcomeController {
    private WelcomeService service = new MockWelcomeServiceImpl();

    ...
}複製代碼

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

<bean name="WelcomeService" class="XXX.XXX.XXX.service.impl.WelcomeServiceImpl"/>複製代碼

而後在業務代碼處經過Spring IOC拿到具體對象:

public class WelcomeController {
    @Autowired
    private WelcomeService service;

    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}複製代碼

測試的時候,只須要更改配置文件,將WelcomeService對應的實現改成MockWelcomeServiceImpl便可:

<bean name="WelcomeService" class="XXX.XXX.XXX.service.impl.MockWelcomeServiceImpl"/>複製代碼

這種方式對業務代碼沒有任何侵入,它有效的實現鬆耦合,你們都知道緊耦合的代碼是業務發展的噩夢;同時,Spring IOC提供的遠不止這些,如經過單例減小建立無用的對象,經過延遲加載優化初始化成本等

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

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

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

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

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

<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>com.qgd.oms.web.common.mvc.OmsDispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>複製代碼

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

<mvc:resources mapping="/css/**/*" location="/static/css/" cache-period="21600"/>
    <mvc:resources mapping="/js/**/*" location="/static/js/" cache-period="21600"/>
    <mvc:resources mapping="/views/**/*.html" location="/static/views/" cache-period="21600"/>
    <mvc:resources mapping="/fonts/**/*" location="/static/fonts/"/>
    <mvc:resources mapping="/ueditor/**/*" location="/static/js/lib/ueditor/"/>
    <mvc:resources mapping="/img/**/*" location="/static/img/"/>

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="validationQuery" value="${jdbc.validationQuery}"/>
        <property name="maxTotal" value="10"/>
        <property name="minIdle" value="5"/>
        <property name="maxIdle" value="10"/>
        <property name="defaultAutoCommit" value="true"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="true"/>
        <property name="poolPreparedStatements" value="true"/>
        <property name="maxOpenPreparedStatements" value="50"/>
    </bean>

    <bean id="configService" class="com.qgd.oms.web.common.service.ConfigService">
        <property name="configStore">
            <bean class="com.qgd.oms.web.common.service.impl.DbConfigStore">
                <property name="dataSource" ref="dataSource"/>
                    <property name="taskScheduler" ref="defaultScheduler"/>
                <property name="refreshInterval" value="30000"/>
            </bean>
        </property>
    </bean>複製代碼

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

<http pattern="/css/**/*" security="none"/>
    <http pattern="/js/**/*" security="none"/>
    <http pattern="/views/**/*.html" security="none"/>
    <http pattern="/fonts/**/*" security="none"/>
    <http pattern="/ueditor/**/*" security="none"/>
    <http pattern="/img/**/*" security="none"/>

    <http use-expressions="true" entry-point-ref="omsAuthenticationEntryPoint">
        <logout logout-url="/omsmc/authentication/logout/*" success-handler-ref="omsLogoutSuccessHandler"></logout>
        <intercept-url pattern='/omsmc/authentication/login*' access="permitAll" />
        <intercept-url pattern='/ms/**/*' access="permitAll" />
        <intercept-url pattern='/**' access="authenticated" />
        <!--<security:form-login />-->
        <custom-filter ref="omsUsernamePasswordAuthenticationFilter" position="FORM_LOGIN_FILTER" />
        <remember-me services-ref="omsRememberMeServices" key="yfboms"/>
        <csrf disabled="true"/>
    </http>複製代碼

增長業務代碼,如controller,service,model等,最後生成war包,經過容器進行啓動

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

初期的Spring經過代碼加配置的形式爲項目提供了良好的靈活性和擴展性,但隨着Spring愈來愈龐大,其配置文件也愈來愈繁瑣,太多複雜的xml文件也一直是Spring被人詬病的地方,特別是近些年其餘簡潔的WEB方案層出不窮,如基於Python或Node.Js,幾行代碼就能實現一個WEB服務器,對比起來,你們漸漸以爲Spring那一套太過繁瑣,此時,Spring社區推出了Spring Boot,它的目的在於實現自動配置,下降項目搭建的複雜度,如須要搭建一個接口服務,經過Spring Boot,幾行代碼便可實現,請看代碼示例:

//引入spring-boot-starter-web依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>複製代碼

//聲明Spring Boot應用,直接寫業務邏輯便可
@Controller
@SpringBootApplication
public class MockServerApplication {
    @RequestMapping("/hi")
    @ResponseBody
    String home() {
        return "how are you!";
    }

    public static void main(String[] args) {
        SpringApplication.run(MockServerApplication.class, args);
    }
}複製代碼

你甚至都不用額外的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便可

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本來靈活強大的功能,下面用一張圖來描述三者的關係:


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

相關文章
相關標籤/搜索