Spring Boot
Spring Boot 是微服務中最好的 Java 框架. 我們建議你能夠成為一名 Spring Boot 的專家.
問題一: Spring Boot、Spring MVC 和 Spring 有什麼區別?
SpringFrame
SpringFramework 最重要的特徵是依賴注入。所有 SpringModules 不是依賴注入就是 IOC 控制反轉。當我們恰當的使用 DI 或者是 IOC 的時候,我們可以開發松耦合應用。松耦合應用的單元測試可以很容易的進行。
SpringMVC
Spring MVC 提供了一種分離式的方法來開發 Web 應用。通過運用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些簡單的概念,開發 Web 應用將會變的非常簡單。SpringBoot
Spring 和 SpringMVC 的問題在於需要配置大量的參數。
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
/WEB-INF/views/
.jsp
複製代碼
Spring Boot 通過一個自動配置和啟動的項來目解決這個問題。為了更快的構建產品就緒應用程序,Spring Boot 提供了一些非功能性特徵。
問題二:什麼是自動配置?
Spring 和 SpringMVC 的問題在於需要配置大量的參數。
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
/WEB-INF/views/
.jsp
複製代碼
我們能否帶來更多的智能?當一個 MVC JAR 添加到應用程序中的時候,我們能否自動配置一些 beans?
Spring 查看(CLASSPATH 上可用的框架)已存在的應用程序的配置。在此基礎上,Spring Boot 提供了配置應用程序和框架所需要的基本配置。這就是自動配置。問題三:什麼是 Spring Boot Stater ?
啟動器是一套方便的依賴沒描述符,它可以放在自己的程序中。你可以一站式的獲取你所需要的 Spring 和相關技術,而不需要依賴描述符的通過示例代碼搜索和複製黏貼的負載。例如,如果你想使用 Sping 和 JPA 訪問數據庫,只需要你的項目包含 spring-boot-starter-data-jpa 依賴項,你就可以完美進行。
## 問題四:你能否舉一個例子來解釋更多 Staters 的內容?
讓我們來思考一個 Stater 的例子 -Spring Boot Stater Web。
如果你想開發一個 web 應用程序或者是公開 REST 服務的應用程序。Spring Boot Start Web 是首選。讓我們使用 Spring Initializr 創建一個 Spring Boot Start Web 的快速項目。
Spring Boot Start Web 的依賴項
org.springframework.boot
spring-boot-starter-web
複製代碼
下面的截圖是添加進我們應用程序的不同的依賴項
依賴項可以被分為
Spring - core,beans,context,aop
Web MVC - (Spring MVC)
Jackson - for JSON Binding
Validation - Hibernate,Validation API
Enbedded Servlet Container - Tomcat
Logging - logback,slf4j
任何經典的 Web 應用程序都會使用所有這些依賴項。Spring Boot Starter Web 預先打包了這些依賴項。
作為一個開發者,我不需要再擔心這些依賴項和它們的兼容版本。問題四:Spring Boot 還提供了其它的哪些 Starter Project Options?
Spring Boot 也提供了其它的啟動器項目包括,包括用於開發特定類型應用程序的典型依賴項。
spring-boot-starter-web-services - SOAP Web Services
spring-boot-starter-web - Web 和 RESTful 應用程序
spring-boot-starter-test - 單元測試和集成測試
spring-boot-starter-jdbc - 傳統的 JDBC
spring-boot-starter-hateoas - 為服務添加 HATEOAS 功能
spring-boot-starter-security - 使用 SpringSecurity 進行身份驗證和授權
spring-boot-starter-data-jpa - 帶有 Hibeernate 的 Spring Data JPA
spring-boot-starter-data-rest - 使用 Spring Data REST 公佈簡單的 REST 服務
問題五: Spring 是如何快速創建產品就緒應用程序的?
Spring Boot 致力於快速產品就緒應用程序。為此,它提供了一些譬如高速緩存,日誌記錄,監控和嵌入式服務器等開箱即用的非功能性特徵。
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-cache - 啟用 Spring Framework 的緩存支持
###Spring2 和 Spring5 所需要的最低 Java 版本是什麼?
Spring Boot 2.0 需要 Java8 或者更新的版本。Java6 和 Java7 已經不再支持。
github.com/spring-proj…
問題六:創建一個 Spring Boot Project 的最簡單的方法是什麼?
Spring Initializr是啟動 Spring Boot Projects 的一個很好的工具。
- 就像上圖中所展示的一樣,我們需要做一下幾步:
- 登錄 Spring Initializr,按照以下方式進行選擇:
- 選擇 com.in28minutes.springboot 為組
- 選擇 studet-services 為組件
- 選擇下面的依賴項
- Web
- Actuator
- DevTools
- 點擊生 GenerateProject
- 將項目導入 Eclipse。文件 - 導入 - 現有的 Maven 項目
問題七:Spring Initializr 是創建 Spring Boot Projects 的唯一方法嗎?
不是的。
Spring Initiatlizr 讓創建 Spring Boot 項目變的很容易,但是,你也可以通過設置一個 maven 項目並添加正確的依賴項來開始一個項目。
在我們的 Spring 課程中,我們使用兩種方法來創建項目。
第一種方法是 start.spring.io 。
另外一種方法是在項目的標題為“Basic Web Application”處進行手動設置。
手動設置一個 maven 項目
這裡有幾個重要的步驟:
- 在 Eclipse 中,使用文件 - 新建 Maven 項目來創建一個新項目
- 添加依賴項。
- 添加 maven 插件。
- 添加 Spring Boot 應用程序類。
到這裡,準備工作已經做好!
問題八:為什麼我們需要 spring-boot-maven-plugin?
spring-boot-maven-plugin 提供了一些像 jar 一樣打包或者運行應用程序的命令。
- spring-boot:run 運行你的 SpringBooty 應用程序。
- spring-boot:repackage 重新打包你的 jar 包或者是 war 包使其可執行
- spring-boot:start 和 spring-boot:stop 管理 Spring Boot 應用程序的生命週期(也可以說是為了集成測試)。
- spring-boot:build-info 生成執行器可以使用的構造信息。
問題九 如何使用 SpringBoot 自動重裝我的應用程序?
使用 Spring Boot 開發工具。
把 Spring Boot 開發工具添加進入你的項目是簡單的。
把下面的依賴項添加至你的 Spring Boot Project pom.xml 中
org.springframework.boot
spring-boot-devtools
runtime
複製代碼
重啟應用程序,然後就可以了。
同樣的,如果你想自動裝載頁面,有可以看看 FiveReload
- www.logicbig.com/tutorials/s….
在我測試的時候,發現了 LiveReload 漏洞,如果你測試時也發現了,請一定要告訴我們。
問題十 什麼是嵌入式服務器?我們為什麼要使用嵌入式服務器呢?
思考一下在你的虛擬機上部署應用程序需要些什麼。
第一步: 安裝 Java
第二部: 安裝 Web 或者是應用程序的服務器(Tomat/Wbesphere/Weblogic 等等)
第三部: 部署應用程序 war 包
如果我們想簡化這些步驟,應該如何做呢?
讓我們來思考如何使服務器成為應用程序的一部分?
你只需要一個安裝了 Java 的虛擬機,就可以直接在上面部署應用程序了,是不是很爽?這個想法是嵌入式服務器的起源。
當我們創建一個可以部署的應用程序的時候,我們將會把服務器(例如,tomcat)嵌入到可部署的服務器中。
例如,對於一個 Spring Boot 應用程序來說,你可以生成一個包含 Embedded Tomcat 的應用程序 jar。你就可以想運行正常 Java 應用程序一樣來運行 web 應用程序了。嵌入式服務器就是我們的可執行單元包含服務器的二進制文件(例如,tomcat.jar)。
問題十一 如何在 Spring Boot 中添加通用的 JS 代碼?
在源文件夾下,創建一個名為 static 的文件夾。然後,你可以把你的靜態的內容放在這裡面。
例如,myapp.js 的路徑是 resources\static\js\myapp.js
你可以參考它在 jsp 中的使用方法
複製代碼
錯誤:HAL browser gives me unauthorized error - Full authenticaition is required to access this resource.
該如何來修復這個錯誤呢?
{
"timestamp": 1488656019562,
"status": 401,
"error": "Unauthorized",
"message": "Full authentication is required to access this resource.",
"path": "/beans"
}
複製代碼
兩種方法:
方法 1:關閉安全驗證
application.properties
management.security.enabled:FALSE
複製代碼
方法二:在日誌中搜索密碼並傳遞至請求標頭中
問題十二 什麼是 Spring Date?
來自://projects.spring.io/spring- data/
Spring Data 的使命是在保證底層數據存儲特殊性的前提下,為數據訪問提供一個熟悉的,一致性的,基於 Spring 的編程模型。這使得使用數據訪問技術,關係數據庫和非關係數據庫,map-reduce 框架以及基於雲的數據服務變得很容易。為了讓它更簡單一些,Spring Data 提供了不受底層數據源限制的 Abstractions 接口。
下面來舉一個例子
interface TodoRepository extends CrudRepository{
複製代碼
你可以定義一簡單的庫,用來插入,更新,刪除和檢索代辦事項,而不需要編寫大量的代碼。
問題十三 什麼是 Spring Data REST?
Spring Data TEST 可以用來發布關於 Spring 數據庫的 HATEOAS RESTful 資源。
下面是一個使用 JPA 的例子
@RepositoryRestResource(collectionResourceRel = "todos", path = "todos")
public interface TodoRepository
extends PagingAndSortingRepository{
複製代碼
不需要寫太多代碼,我們可以發佈關於 Spring 數據庫的 RESTful API。
下面展示的是一些關於 TEST 服務器的例子
POST
- URL:http://localhost:8080/todos
- Use Header:Content-Type:Type:application/json
- Request Content
代碼如下
{
"user": "Jill",
"desc": "Learn Hibernate",
"done": false
}
複製代碼
響應內容
{
"user": "Jill",
"desc": "Learn Hibernate",
"done": false,
"_links": {
"self": {
"href": "http://localhost:8080/todos/1"
},
"todo": {
"href": "http://localhost:8080/todos/1"
}
}
}
複製代碼
響應包含新創建資源的 href。
問題十四 path=”users”, collectionResourceRel=”users” 如何與 Spring Data Rest 一起使用?
@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRestRepository extends
PagingAndSortingRepository
複製代碼
- path- 這個資源要導出的路徑段。
- collectionResourceRel- 生成指向集合資源的鏈接時使用的 rel 值。在生成 HATEOAS 鏈接時使用。
問題十五 當 Spring Boot 應用程序作為 Java 應用程序運行時,後臺會發生什麼?
如果你使用 Eclipse IDE,Eclipse maven 插件確保依賴項或者類文件的改變一經添加,就會被編譯並在目標文件中準備好!在這之後,就和其它的 Java 應用程序一樣了。
當你啟動 java 應用程序的時候,spring boot 自動配置文件就會魔法般的啟用了。
- 當 Spring Boot 應用程序檢測到你正在開發一個 web 應用程序的時候,它就會啟動 tomcat。
問題十六:我們能否在 spring-boot-starter-web 中用 jetty 代替 tomcat?
在 spring-boot-starter-web 移除現有的依賴項,並把下面這些添加進去。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-jetty
複製代碼
## 問題十七 如何使用 Spring Boot 生成一個 WAR 文件?
- spring.io/guides/gs/c…
下面有 spring 說明文檔直接的鏈接地址:
- docs.spring.io/spring-boot…
問題十八 如何使用 Spring Boot 部署到不同的服務器?
你需要做下面兩個步驟:
- 在一個項目中生成一個 war 文件。
- 將它部署到你最喜歡的服務器(websphere 或者 Weblogic 或者 Tomcat and so on)。
第一步:這本入門指南應該有所幫助:
spring.io/guides/gs/c…
第二步:取決於你的服務器。
問題十九 RequestMapping 和 GetMapping 的不同之處在哪裡?
- RequestMapping 具有類屬性的,可以進行 GET,POST,PUT 或者其它的註釋中具有的請求方法。
- GetMapping 是 GET 請求方法中的一個特例。它只是 ResquestMapping 的一個延伸,目的是為了提高清晰度。
問題二十 為什麼我們不建議在實際的應用程序中使用 Spring Data Rest?
我們認為 Spring Data Rest 很適合快速原型製造!在大型應用程序中使用需要謹慎。
通過 Spring Data REST 你可以把你的數據實體作為 RESTful 服務直接發佈。
當你設計 RESTful 服務器的時候,最佳實踐表明,你的接口應該考慮到兩件重要的事情:
- 你的模型範圍。
- 你的客戶。
通過 With Spring Data REST,你不需要再考慮這兩個方面,只需要作為 TEST 服務發佈實體。
這就是為什麼我們建議使用 Spring Data Rest 在快速原型構造上面,或者作為項目的初始解決方法。對於完整演變項目來說,這並不是一個好的注意。
問題二十一 在 Spring Initializer 中,如何改變一個項目的包名字?
好消息是你可以定製它。點擊鏈接“轉到完整版本”。你可以配置你想要修改的包名稱!
問題二十二 可以配置 application.propertierde 的完整的屬性列表在哪裡可以找到?
這裡是完整的指南:
- docs.spring.io/spring-boot…
問題二十三 JPA 和 Hibernate 有哪些區別?
簡而言之
- JPA 是一個規範或者接口
- Hibernate 是 JPA 的一個實現
當我們使用 JPA 的時候,我們使用 javax.persistence 包中的註釋和接口時,不需要使用 hibernate 的導入包。
我們建議使用 JPA 註釋,因為哦我們沒有將其綁定到 Hibernate 作為實現。後來(我知道 - 小於百分之一的幾率),我們可以使用另一種 JPA 實現。
問題二十四 業務邊界應該從哪一層開始?
我們建議在服務層管理義務。商業業務邏輯在商業層或者服務層,與此同時,你想要執行的業務管理也在該層。
問題二十五 使用 Spring Boot 啟動連接到內存數據庫 H2 的 JPA 應用程序需要哪些依賴項?
在 Spring Boot 項目中,當你確保下面的依賴項都在類路里面的時候,你可以加載 H2 控制檯。
- web 啟動器
- h2
- jpa 數據啟動器
其它的依賴項在下面:
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
runtime
複製代碼
需要注意的一些地方:
- 一個內部數據內存只在應用程序執行期間存在。這是學習框架的有效方式。
- 這不是你希望的真是世界應用程序的方式。
- 在問題“如何連接一個外部數據庫?”中,我們解釋瞭如何連接一個你所選擇的數據庫。
問題二十六 如何不通過任何配置來選擇 Hibernate 作為 JPA 的默認實現?
因為 Spring Boot 是自動配置的。
下面是我們添加的依賴項
org.springframework.boot
spring-boot-starter-data-jpa
複製代碼
spring-boot-stater-data-jpa 對於 Hibernate 和 JPA 有過渡依賴性。
當 Spring Boot 在類路徑中檢測到 Hibernate 中,將會自動配置它為默認的 JPA 實現。
問題二十七 指定的數據庫連接信息在哪裡?它是如何知道自動連接至 H2 的?
這就是 Spring Boot 自動配置的魔力。
來自:docs.spring.io/spring-boot…
Spring Boot auto-configuration 試圖自動配置你已經添加的基於 jar 依賴項的 Spring 應用程序。比如說,如果 HSQLDBis 存在你的類路徑中,並且,數據庫連接 bean 還沒有手動配置,那麼我們可以自動配置一個內存數據庫。
進一步的閱讀:
www.springboottutorial.com/spring-boot…
第二十八題,我們如何連接一個像 MSSQL 或者 orcale 一樣的外部數據庫?
讓我們以 MySQL 為例來思考這個問題:
第一步 - 把 mysql 連接器的依賴項添加至 pom.xml
mysql
mysql-connector-java
複製代碼
第二步 - 從 pom.xml 中移除 H2 的依賴項
或者至少把它作為測試的範圍。
複製代碼
第三步 - 安裝你的 MySQL 數據庫
更多的來看看這裡 -github.com/in28minutes…
第四步 - 配置你的 MySQL 數據庫連接
配置 application.properties
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/todo_example
spring.datasource.username=todouser
spring.datasource.password=YOUR_PASSWORD
複製代碼
第五步 - 重新啟動,你就準備好了!
就是這麼簡單!
問題二十九 Spring Boot 配置的默認 H2 數據庫的名字是上面?為什麼默認的數據庫名字是 testdb?
在 application.properties 裡面,列出了所有的默認值
- docs.spring.io/spring-boot…
找到下面的屬性
spring.datasource.name=testdb # Name of the datasource.
複製代碼
如果你使用了 H2 內部存儲數據庫,它裡面確定了 Spring Boot 用來安裝你的 H2 數據庫的名字。
問題三十 如果 H2 不在類路徑裡面,會出現上面情況?
將會報下面的錯誤
Cannot determine embedded database driver class for database type NONE
複製代碼
把 H2 添加至 pom.xml 中,然後重啟你的服務器
com.h2database
h2 runtime
複製代碼
問題三十一 你能否舉一個以 ReadOnly 為事務管理的例子?
- 當你從數據庫讀取內容的時候,你想把事物中的用戶描述或者是其它描述設置為只讀模式,以便於 Hebernate 不需要再次檢查實體的變化。這是非常高效的。
- 說道這裡順便打一個廣告,給大家推薦一個我新建的Java交流社區:547483794,裡面不僅可以交流討論,還有面試經驗和麵試題分享以及免費的資料下載,包括Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。相信對於已經工作和遇到技術瓶頸的碼友,在這個群裡會有你需要的內容。
問題三十二 發佈 Spring Boot 用戶應用程序自定義配置的最好方法是什麼?
@Value 的問題在於,您可以通過應用程序分配你配置值。更好的操作是採取集中的方法。
你可以使用 @ConfigurationProperties 定義一個配置組件。
@Component
@ConfigurationProperties("basic")
public class BasicConfiguration {
private boolean value;
private String message;
private int number;
複製代碼
你可以在 application.properties 中配置參數。
basic.value: true
basic.message: Dynamic Message
basic.number: 100
複製代碼
問題三十三 配置文件的需求是什麼?
企業應用程序的開發是複雜的,你需要混合的環境:
- Dev
- QA
- Stage
- Production
在每個環境中,你想要不同的應用程序配置。
配置文件有助於在不同的環境中進行不同的應用程序配置。Spring 和 Spring Boot 提供了你可以制定的功能。
- 不同配置文件中,不同環境的配置是什麼?
- 為一個制定的環境設置活動的配置文件。
Spring Boot 將會根據特定環境中設置的活動配置文件來選擇應用程序的配置。
## 問題三十四 如何使用配置文件通過 Spring Boot 配置特定環境的配置?
配置文件不是設別環境的關鍵。
在下面的例子中,我們將會用到兩個配置文件
- dev
- prod
缺省的應用程序配置在 application.properties 中。讓我們來看下面的例子:
application.properties
basic.value= true
basic.message= Dynamic Message
basic.number= 100
複製代碼
我們想要為 dev 文件自定義 application.properties 屬性。我們需要創建一個名為 application-dev.properties 的文件,並且重寫我們想要自定義的屬性。
application-dev.properties
basic.message: Dynamic Message in DEV
複製代碼
一旦你特定配置了配置文件,你需要在環境中設定一個活動的配置文件。
有多種方法可以做到這一點:
- 在 VM 參數中使用 Dspring.profiles.active=prod
- 在 application.properties 中使用 spring.profiles.active=prod
閱讀更多 java高級程序猿 的文章