Spring Boot 是微服務中最好的 Java 框架. 我們建議你能夠成為一名 Spring Boot 的專家。本文精選了三十五個常見的Spring Boot知識點,祝你一臂之力!
問題一
Spring Boot、Spring MVC 和 Spring 有什麼區別?
1、Spring
Spring最重要的特徵是依賴注入。所有 SpringModules 不是依賴注入就是 IOC 控制反轉。
當我們恰當的使用 DI 或者是 IOC 的時候,我們可以開發松耦合應用。松耦合應用的單元測試可以很容易的進行。
2、Spring MVC
Spring MVC 提供了一種分離式的方法來開發 Web 應用。通過運用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些簡單的概念,開發 Web 應用將會變的非常簡單。
3、SpringBoot
Spring 和 SpringMVC 的問題在於需要配置大量的參數。
Spring Boot 通過一個自動配置和啟動的項來目解決這個問題。為了更快的構建產品就緒應用程序,Spring Boot 提供了一些非功能性特徵。
問題二
什麼是自動配置?
Spring 和 SpringMVC 的問題在於需要配置大量的參數。
我們能否帶來更多的智能?當一個 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 的依賴項
下面的截圖是添加進我們應用程序的不同的依賴項
依賴項可以被分為:
- 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 已經不再支持。
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes
問題七
創建一個 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 中
重啟應用程序,然後就可以了。
同樣的,如果你想自動裝載頁面,有可以看看 FiveReload
- http://www.logicbig.com/tutorials/spring-framework/spring-boot/boot-live-reload/.
在我測試的時候,發現了 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.
該如何來修復這個錯誤呢?
兩種方法:
方法 1:關閉安全驗證
application.properties
management.security.enabled:FALSE方法二:在日誌中搜索密碼並傳遞至請求標頭中
問題十三
什麼是 Spring Data?
來自://projects.spring.io/spring- data/
Spring Data 的使命是在保證底層數據存儲特殊性的前提下,為數據訪問提供一個熟悉的,一致性的,基於 Spring 的編程模型。這使得使用數據訪問技術,關係數據庫和非關係數據庫,map-reduce 框架以及基於雲的數據服務變得很容易。
為了讓它更簡單一些,Spring Data 提供了不受底層數據源限制的 Abstractions 接口。
下面來舉一個例子:
你可以定義一簡單的庫,用來插入,更新,刪除和檢索代辦事項,而不需要編寫大量的代碼。
問題十四
什麼是 Spring Data REST?
Spring Data TEST 可以用來發布關於 Spring 數據庫的 HATEOAS RESTful 資源。
下面是一個使用 JPA 的例子:
不需要寫太多代碼,我們可以發佈關於 Spring 數據庫的 RESTful API。
下面展示的是一些關於 TEST 服務器的例子
POST:
- URL:http://localhost:8080/todos
- Use Header:Content-Type:Type:application/json
- Request Content
代碼如下:
響應內容:
響應包含新創建資源的 href。
問題十五
path=”users”, collectionResourceRel=”users” 如何與 Spring Data Rest 一起使用?
- 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 移除現有的依賴項,並把下面這些添加進去。
問題十八
如何使用 Spring Boot 生成一個 WAR 文件?
- https://spring.io/guides/gs/convert-jar-to-war/
下面有 spring 說明文檔直接的鏈接地址:
- https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging
問題十八
如何使用 Spring Boot 生成一個 WAR 文件?
- https://spring.io/guides/gs/convert-jar-to-war/
下面有 spring 說明文檔直接的鏈接地址:
- https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging
問題十九
如何使用 Spring Boot 部署到不同的服務器?
你需要做下面兩個步驟:
- 在一個項目中生成一個 war 文件。
- 將它部署到你最喜歡的服務器(websphere 或者 Weblogic 或者 Tomcat and so on)。
第一步:這本入門指南應該有所幫助:
https://spring.io/guides/gs/convert-jar-to-war/
第二步:取決於你的服務器。
問題二十
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 的完整的屬性列表在哪裡可以找到?
這裡是完整的指南:
- https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
問題二十四
JPA 和 Hibernate 有哪些區別?
簡而言之
- JPA 是一個規範或者接口
- Hibernate 是 JPA 的一個實現
當我們使用 JPA 的時候,我們使用 javax.persistence 包中的註釋和接口時,不需要使用 hibernate 的導入包。
我們建議使用 JPA 註釋,因為哦我們沒有將其綁定到 Hibernate 作為實現。後來(我知道 - 小於百分之一的幾率),我們可以使用另一種 JPA 實現。
問題二十五
業務邊界應該從哪一層開始?
我們建議在服務層管理義務。商業業務邏輯在商業層或者服務層,與此同時,你想要執行的業務管理也在該層。
問題二十六
使用 Spring Boot 啟動連接到內存數據庫 H2 的 JPA 應用程序需要哪些依賴項?
在 Spring Boot 項目中,當你確保下面的依賴項都在類路里面的時候,你可以加載 H2 控制檯。
- web 啟動器
- h2
- jpa 數據啟動器
其它的依賴項在下面:
需要注意的一些地方:
- 一個內部數據內存只在應用程序執行期間存在。這是學習框架的有效方式。
- 這不是你希望的真是世界應用程序的方式。
- 在問題“如何連接一個外部數據庫?”中,我們解釋瞭如何連接一個你所選擇的數據庫。
問題二十七
如何不通過任何配置來選擇 Hibernate 作為 JPA 的默認實現?
因為 Spring Boot 是自動配置的。
下面是我們添加的依賴項:
spring-boot-stater-data-jpa 對於 Hibernate 和 JPA 有過渡依賴性。
當 Spring Boot 在類路徑中檢測到 Hibernate 中,將會自動配置它為默認的 JPA 實現。
問題二十八
指定的數據庫連接信息在哪裡?它是如何知道自動連接至 H2 的?
這就是 Spring Boot 自動配置的魔力。
來自:https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html
Spring Boot auto-configuration 試圖自動配置你已經添加的基於 jar 依賴項的 Spring 應用程序。比如說,如果 HSQLDBis 存在你的類路徑中,並且,數據庫連接 bean 還沒有手動配置,那麼我們可以自動配置一個內存數據庫。
進一步的閱讀:
http://www.springboottutorial.com/spring-boot-auto-configuration
問題二十九
我們如何連接一個像 MySQL 或者Orcale 一樣的外部數據庫?
讓我們以 MySQL 為例來思考這個問題:
第一步 - 把 mysql 連接器的依賴項添加至 pom.xml
第二步 - 從 pom.xml 中移除 H2 的依賴項
或者至少把它作為測試的範圍。
第三步 - 安裝你的 MySQL 數據庫
更多的來看看這裡 -https://github.com/in28minutes/jpa-with-hibernate#installing-and-setting-up-mysql
第四步 - 配置你的 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 裡面,列出了所有的默認值
- https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
找到下面的屬性
# Name of the datasource.spring.datasource.name=testdb如果你使用了 H2 內部存儲數據庫,它裡面確定了 Spring Boot 用來安裝你的 H2 數據庫的名字。
問題三十一
如果 H2 不在類路徑裡面,會出現上面情況?
將會報下面的錯誤
Cannot determine embedded database driver class for database type NONE把 H2 添加至 pom.xml 中,然後重啟你的服務器
問題三十二
你能否舉一個以 ReadOnly 為事務管理的例子?
- 當你從數據庫讀取內容的時候,你想把事物中的用戶描述或者是其它描述設置為只讀模式,以便於 Hebernate 不需要再次檢查實體的變化。這是非常高效的。
問題三十三
發佈 Spring Boot 用戶應用程序自定義配置的最好方法是什麼?
@Value 的問題在於,您可以通過應用程序分配你配置值。更好的操作是採取集中的方法。
你可以使用 @ConfigurationProperties 定義一個配置組件。
你可以在 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
閱讀更多 牛旦教育IT課堂 的文章