原文連結: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 JMS
和Spring JDBC
。
這些模組是否帶來了任何新功能?並沒有!我們可以使用J2EE
或Java EE
完成所有這些工作。那麼,它們帶來了什麼?它們帶來了簡單的抽象。這些抽象的目的是為了:
- 減少樣版程式碼/減少重複
- 促進解耦/增加單元可測試性
例如,與傳統的JDBC
或JMS
相比,使用JDBCTemplate
或JMSTemplate
所需的程式碼要少得多。
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 jar
在classpath
上,自動配置資料來源怎麼樣? - 如果
Spring MVC jar
在classpath
上,那麼自動配置Dispatcher Servlet
怎麼樣?
這將有規定會覆蓋預設的自動配置。
Spring Boot檢視應用的CLASSPATH已存在的配置,基於這些,SpringBoot提供應用程式中框架所需要的這些基本配置。這被稱為自動裝配(Auto Configuration)
5.2.問題2:Spring Boot Starter
專案:圍繞眾所周知的模式構建
假設我們想開發一個Web應用程式。
首先,我們需要確定我們想要使用的框架,使用哪些框架版本以及如何將它們連線在一起。所有Web應用程式都有類似的需求。下面列出了我們在Spring MVC課程中使用的一些依賴項。這些包括Spring MVC
,Jackson 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依賴項就行了
讓我們考慮一個示例
starter
:Spring 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:啟用高階監控和跟蹤應用程式。
- 嵌入式伺服器整合:由於伺服器已整合到應用程式中,因此我需要在伺服器上安裝單獨的應用程式伺服器。
- 預設錯誤處理