Sping、SpringMVC、SpringBoot的對比

鍋外的大佬發表於2019-05-26

原文連結:https://dzone.com/articles/spring-boot-vs-spring-mvc-vs-spring-how-do-they-compare

作者: Ranga Karanam

譯者:Yunooa

推薦關注公眾號: 鍋外的大佬
每日推送,專注分享國外最新技術內容,幫助每位開發者更優秀地成長

在本文中,你將獲取到有關於Spring,Spring MVC和Spring Boot的概述,瞭解他們解決的問題以及最佳的應用位置。最重要的是Spring,Spring MVC和Spring Boot不會矛盾。他們很好的解決了不同的問題。

1.Spring框架解決的核心問題是什麼?

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

 


 

 


Spring Framework最重要的特性是依賴注入

所有Spring模組的核心是依賴注入或IOC控制反轉

 

 



為什麼這很重要?因為,當正確使用DI或IOC時,我們可以開發鬆耦合的應用程式。鬆耦合的應用程式可以很方便進行單元測試。

 

舉個簡單的例子。

2.沒有依賴注入的示例

請考慮以下示例:WelcomeController依賴於WelcomeService來獲取歡迎訊息。它是如何獲取WelcomeService例項的?

WelcomeService service = new WelcomeService();

它正在建立它的一個例項,這意味著他們緊密相連。例如:如果我在WelcomeController的單元測試中為WelcomeService建立一個模擬器,我如何使用模mock建立WelcomeController?沒那麼簡單!

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

3.相同的示例使用依賴注入

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

使用@Component告訴Spring Framework:這是一個你需要管理的bean
使用@Autowired告訴Spring Framework:找到這個特定型別的正確匹配並自動裝配它。
在下面的示例中,Spring框架將為WelcomeService建立一個bean,並將其自動裝入WelcomeController
在單元測試中,我可以要求Spring框架將WelcomeService的模擬自動連線到WelcomeController。(Spring Boot使用@MockBean可以很容易地做到這一點。但是,這是另外一件事了!)

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

3.Spring Framework還能解決什麼問題?

3.2.問題1:減少樣板程式碼

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

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

仔細想想Spring JMSSpring JDBC
這些模組是否帶來了任何新功能?並沒有!我們可以使用J2EEJava EE完成所有這些工作。那麼,它們帶來了什麼?它們帶來了簡單的抽象。這些抽象的目的是為了:

  • 減少樣版程式碼/減少重複
  • 促進解耦/增加單元可測試性

例如,與傳統的JDBCJMS相比,使用JDBCTemplateJMSTemplate所需的程式碼要少得多。

3.2.問題2:與其他框架的良好整合

Spring Framework的優點在於它不會嘗試解決已經解決的問題。它所做的就是提供與框架的完美整合,從而提供出色的解決方案。

  • Hibernate for ORM
  • iBatis for Object Mapping
  • JUnit和Mockito進行單元測試

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

 


 

 


Spring MVC Framewrok提供了開發Web應用程式的分離方式。使用Dispatcher Servlet,ModelAndView,View Resolver等概念,可以輕鬆開發Web應用程式

 


5.我們為什麼需要springboot?

基於Spring的應用程式有很多配置。當我們使用Spring MVC時,我們需要配置元件掃描(component scan),dispatcher servlet,檢視解析器(View Resolver),Web jar(用於提供靜態內容)等。

<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應用程式中排程程式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>

當我們使用Hibernate/JPA時,我們需要配置資料來源(datasource),實體管理器工廠(entity manager factory),事務管理器(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"/>

5.1.問題1:Spring Boot自動配置:我們能有不同的想法嗎?

Spring Boot帶來了一個全新的思維過程:

 


 

 


我們能在這方面思考更深入嗎?

spring mvc jar被新增到應用程式中時,我們可以自動配置一些bean嗎?

 

 


 

  • 如果Hibernate jarclasspath上,自動配置資料來源怎麼樣?
  • 如果Spring MVC jarclasspath上,那麼自動配置Dispatcher Servlet怎麼樣?
    這將有規定會覆蓋預設的自動配置。



    Spring Boot檢視應用的CLASSPATH已存在的配置,基於這些,SpringBoot提供應用程式中框架所需要的這些基本配置。這被稱為自動裝配(Auto Configuration)

5.2.問題2:Spring Boot Starter專案:圍繞眾所周知的模式構建

假設我們想開發一個Web應用程式。

首先,我們需要確定我們想要使用的框架,使用哪些框架版本以及如何將它們連線在一起。所有Web應用程式都有類似的需求。下面列出了我們在Spring MVC課程中使用的一些依賴項。這些包括Spring MVCJackson Databind(用於資料繫結),Hibernate-Validator(用於使用Java Validation API的伺服器端驗證)和Log4j(用於日誌記錄)。在建立此課程時,我們必須選擇所有這些框架的相容版本。

<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文件中關於starter的內容.

 


 

 


starter是一組方便的依賴關係描述符,你可以在應用程式中包含這些描述符。可以獲得所需的所有Spring和相關技術的一站式服務,而無需搜尋示例程式碼並複製貼上依賴。

例如,如果你想使用Spring 和JPA進行資料庫訪問

只需在專案中包含spring-boot-starter-data-jpa依賴項就行了

 

 



讓我們考慮一個示例starterSpring Boot Starter Web

 

如果您想開發Web應用程式或應用程式來公開restful服務,Spring Boot Start Web是首選。使用Spring Initializr建立一個使用Spring Boot Starter Web的快速專案。
Spring Boot Starter Web的依賴關係

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

以下截圖顯示了應用程式中不同依賴項:

依賴關係可分為:

  • Spring:核心,bean,context,aop
  • Web MVC :( Spring MVC)
  • JackSon:用於JSON繫結
  • Validation:Hibernate驗證器,驗證API
  • 嵌入式Servlet容器:Tomcat
  • Logging:logback,slf4j

任何典型的Web應用程式都將使用所有這些依賴項。Spring Boot Starter Web預裝了這些。作為開發人員,我不需要擔心這些依賴項或它們的相容版本。

6.Spring Boot Starter專案選項

正如我們從Spring Boot Starter Web中看到的那樣,入門專案幫助我們快速開始開發特定型別的應用程式。

  • spring-boot-starter-web-services:SOAP Web服務
  • spring-boot-starter-web:Web和RESTful應用程式
  • spring-boot-starter-test:單元測試和整合測試
  • spring-boot-starter-jdbc:傳統的JDBC
  • spring-boot-starter-hateoas:為您的服務新增HATEOAS功能
  • spring-boot-starter-security:使用Spring Security進行身份驗證和授權
  • spring-boot-starter-data-jpa:帶有Hibernate的Spring Data JPA
  • spring-boot-starter-cache:啟用Spring Framework的快取支援
  • spring-boot-starter-data-rest:使用Spring Data REST公開簡單REST服務

7.Spring Boot的其他目標

一些技術性的starter:

  • spring-boot-starter-actuator:使用開箱即用的監控和跟蹤等高階功能
  • spring-boot-starter-undertow,spring-boot-starter-jetty,spring-boot- starter-tomcat:選擇特定的嵌入式Servlet容器
  • spring-boot-starter-logging:用於使用logback進行日誌記錄
  • spring-boot-starter-log4j2:使用Log4j2進行日誌記錄

Spring Boot旨在快速實現生產就緒應用程式。

  • Actuator:啟用高階監控和跟蹤應用程式。
  • 嵌入式伺服器整合:由於伺服器已整合到應用程式中,因此我需要在伺服器上安裝單獨的應用程式伺服器。
  • 預設錯誤處理
2432215

相關文章