Sping、SpringMVC、SpringBoot的對比

在本文中,你將獲取到有關(guān)于Spring,Spring MVC和Spring Boot的概述,了解他們解決的問題以及最佳的應(yīng)用位置。最重要的是Spring,Spring MVC和Spring Boot不會(huì)矛盾。他們很好的解決了不同的問題。

一、Spring框架解決的核心問題是什么?

好好想想,Spring Framework解決了什么問題?

Spring Framework最重要的特性是依賴注入
所有Spring模塊的核心是依賴注入或IOC控制反轉(zhuǎn)

為什么這很重要?因?yàn)椋?dāng)正確使用DI或IOC時(shí),我們可以開發(fā)松耦合的應(yīng)用程序。松耦合的應(yīng)用程序可以很方便進(jìn)行單元測試。

舉個(gè)簡單的例子。

二、沒有依賴注入的示例

請考慮以下示例:WelcomeController依賴于WelcomeService來獲取歡迎消息。它是如何獲取WelcomeService實(shí)例的?

WelcomeService service = new WelcomeService();

它正在創(chuàng)建它的一個(gè)實(shí)例,這意味著他們緊密相連。例如:如果我在WelcomeController的單元測試中為WelcomeService創(chuàng)建一個(gè)模擬器,我如何使用模mock創(chuàng)建WelcomeController?沒那么簡單!

@RestController
public class WelcomeController {
    private WelcomeService service = new WelcomeService();
    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}

三、相同的示例使用依賴注入

依賴注入使世界看起來更簡單。Spring Framework為你做了很多艱難的工作。我們只使用兩個(gè)簡單的注解:@Component和@Autowired。

使用@Component告訴Spring Framework:這是一個(gè)你需要管理的bean。

使用@Autowired告訴Spring Framework:找到這個(gè)特定類型的正確匹配并自動(dòng)裝配它。

在下面的示例中,Spring框架將為WelcomeService創(chuàng)建一個(gè)bean,并將其自動(dòng)裝入WelcomeController。

在單元測試中,我可以要求Spring框架將WelcomeService的模擬自動(dòng)連接到WelcomeController。(Spring Boot使用@MockBean可以很容易地做到這一點(diǎn)。但是,這是另外一件事了?。?/p>

@Component
public class WelcomeService {
    //Bla Bla Bla
}
@RestController
public class WelcomeController {
    @Autowired
    private WelcomeService service;
    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}

四、Spring Framework還能解決什么問題?

問題1:減少樣板代碼

Spring Framework停止了依賴注入?不。許多Spring模塊建立在依賴注入的核心概念之上:

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

仔細(xì)想想Spring JMS和Spring JDBC。

這些模塊是否帶來了任何新功能?并沒有!我們可以使用J2EE或Java EE完成所有這些工作。那么,它們帶來了什么?它們帶來了簡單的抽象。這些抽象的目的是為了:

  • 減少樣版代碼/減少重復(fù)
  • 促進(jìn)解耦/增加單元可測試性

例如,與傳統(tǒng)的JDBC或JMS相比,使用JDBCTemplate或JMSTemplate所需的代碼要少得多。

問題2:與其他框架的良好集成

Spring Framework的優(yōu)點(diǎn)在于它不會(huì)嘗試解決已經(jīng)解決的問題。它所做的就是提供與框架的完美集成,從而提供出色的解決方案。

  • Hibernate for ORM
  • iBatis for Object Mapping
  • JUnit和Mockito進(jìn)行單元測試

五、4.Spring MVC框架解決的核心問題是什么?

Spring MVC Framewrok提供了開發(fā)Web應(yīng)用程序的分離方式。使用Dispatcher Servlet,ModelAndView,View Resolver等概念,可以輕松開發(fā)Web應(yīng)用程序

六、我們?yōu)槭裁葱枰猻pringboot?

基于Spring的應(yīng)用程序有很多配置。當(dāng)我們使用Spring MVC時(shí),我們需要配置組件掃描(component scan),dispatcher servlet,視圖解析器(View Resolver),Web jar(用于提供靜態(tài)內(nèi)容)等。

<bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
  </bean>
  <mvc:resources mapping="/webjars/**" location="/webjars/"/>

下面的代碼片段顯示了Web應(yīng)用程序中調(diào)度程序servlet的典型配置。

<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/todo-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

當(dāng)我們使用Hibernate/JPA時(shí),我們需要配置數(shù)據(jù)源(datasource),實(shí)體管理器工廠(entity manager factory),事務(wù)管理器(transaction manager)等眾多其他事物。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="${db.driver}" />
        <property name="jdbcUrl" value="${db.url}" />
        <property name="user" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>
    <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="classpath:config/schema.sql" />
        <jdbc:script location="classpath:config/data.sql" />
    </jdbc:initialize-database>
    <bean
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        id="entityManagerFactory">
        <property name="persistenceUnitName" value="hsql_pu" />
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>

問題1:Spring Boot自動(dòng)配置:我們能有不同的想法嗎?

Spring Boot帶來了一個(gè)全新的思維過程:

我們能在這方面思考更深入嗎?
當(dāng)spring mvc jar被添加到應(yīng)用程序中時(shí),我們可以自動(dòng)配置一些bean嗎?

  • 如果Hibernate jar在classpath上,自動(dòng)配置數(shù)據(jù)源怎么樣?
  • 如果Spring MVC jar在classpath上,那么自動(dòng)配置Dispatcher Servlet怎么樣?

這將有規(guī)定會(huì)覆蓋默認(rèn)的自動(dòng)配置。

Spring Boot查看應(yīng)用的CLASSPATH已存在的配置,基于這些,SpringBoot提供應(yīng)用程序中框架所需要的這些基本配置。這被稱為自動(dòng)裝配(Auto Configuration)

問題2:Spring Boot Starter項(xiàng)目:圍繞眾所周知的模式構(gòu)建

假設(shè)我們想開發(fā)一個(gè)Web應(yīng)用程序。

首先,我們需要確定我們想要使用的框架,使用哪些框架版本以及如何將它們連接在一起。所有Web應(yīng)用程序都有類似的需求。下面列出了我們在Spring MVC課程中使用的一些依賴項(xiàng)。這些包括Spring MVC,Jackson Databind(用于數(shù)據(jù)綁定),Hibernate-Validator(用于使用Java Validation API的服務(wù)器端驗(yàn)證)和Log4j(用于日志記錄)。在創(chuàng)建此課程時(shí),我們必須選擇所有這些框架的兼容版本。

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>4.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.0.2.Final</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

以下是Spring Boot文檔中關(guān)于starter的內(nèi)容.

如果您想開發(fā)Web應(yīng)用程序或應(yīng)用程序來公開restful服務(wù),Spring Boot Start Web是首選。使用Spring Initializr創(chuàng)建一個(gè)使用Spring Boot Starter Web的快速項(xiàng)目。

Spring Boot Starter Web的依賴關(guān)系

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

以下截圖顯示了應(yīng)用程序中不同依賴項(xiàng):



依賴關(guān)系可分為:

  • Spring:核心,bean,context,aop
  • Web MVC :( Spring MVC)
  • JackSon:用于JSON綁定
  • Validation:Hibernate驗(yàn)證器,驗(yàn)證API
  • 嵌入式Servlet容器:Tomcat
  • Logging:logback,slf4j

任何典型的Web應(yīng)用程序都將使用所有這些依賴項(xiàng)。Spring Boot Starter Web預(yù)裝了這些。作為開發(fā)人員,我不需要擔(dān)心這些依賴項(xiàng)或它們的兼容版本。

七、Spring Boot Starter項(xiàng)目選項(xiàng)

正如我們從Spring Boot Starter Web中看到的那樣,入門項(xiàng)目幫助我們快速開始開發(fā)特定類型的應(yīng)用程序。

  • spring-boot-starter-web-services:SOAP Web服務(wù)
  • spring-boot-starter-web:Web和RESTful應(yīng)用程序
  • spring-boot-starter-test:單元測試和集成測試
  • spring-boot-starter-jdbc:傳統(tǒng)的JDBC
  • spring-boot-starter-hateoas:為您的服務(wù)添加HATEOAS功能
  • spring-boot-starter-security:使用Spring Security進(jìn)行身份驗(yàn)證和授權(quán)
  • spring-boot-starter-data-jpa:帶有Hibernate的Spring Data JPA
  • spring-boot-starter-cache:啟用Spring Framework的緩存支持
  • spring-boot-starter-data-rest:使用Spring Data REST公開簡單REST服務(wù)

八、Spring Boot的其他目標(biāo)

一些技術(shù)性的starter:

  • spring-boot-starter-actuator:使用開箱即用的監(jiān)控和跟蹤等高級功能
  • spring-boot-starter-undertow,spring-boot-starter-jetty,spring-boot- starter-tomcat:選擇特定的嵌入式Servlet容器
  • spring-boot-starter-logging:用于使用logback進(jìn)行日志記錄
  • spring-boot-starter-log4j2:使用Log4j2進(jìn)行日志記錄

Spring Boot旨在快速實(shí)現(xiàn)生產(chǎn)就緒應(yīng)用程序。

  • Actuator:啟用高級監(jiān)控和跟蹤應(yīng)用程序。
  • 嵌入式服務(wù)器集成:由于服務(wù)器已集成到應(yīng)用程序中,因此我需要在服務(wù)器上安裝單獨(dú)的應(yīng)用程序服務(wù)器。
  • 默認(rèn)錯(cuò)誤處理
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容