Spring Boot是Pivotal公司推出的一個全新框架,其目的是爲了簡化Spring項目的初始搭建以及開發過程。html
1)內置服務器,默認使用tomcat服務器前端
2)開箱即用,減小繁瑣的配置過程java
3)上手容易,提升開發效率程序員
4)可避免大量Maven導入和版本衝突web
Spring Boot核心註解是@SpringBootApplication,它主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan組成。spring
@SpringBootConfiguration:繼承自@Configuration,兩者功能也一致,標註當前類是配置類。數據庫
@EnableAutoConfiguration:這個註釋啓用了Spring Boot的自動配置功能,能夠自動爲您配置不少東西。apache
@ComponentScan:根據定義的掃描路徑,把符合掃描規則的類裝配到spring的bean容器中json
- 自定掃描路徑下邊帶有@Controller,@Service,@Repository,@Component註解加入spring容器
- 經過includeFilters加入掃描路徑下沒有以上註解的類加入spring容器
- 經過excludeFilters過濾出不用加入spring容器的類
- 自定義增長了@Component註解的註解方式
@EnableAutoConfiguration實現自動配置,其內部實際上就是去加載MMETA-INF/spring.factories文件的信息,而後篩選出以@EnableAutoConfiguration爲key的數據,加載到IOC容器中,實現自動配置。bootstrap
YAML是一種數據序列化語言,一般用於配置文件,例如application.yml。
(1)配置有序
(2)樹形結構,清晰明瞭
(3)支持數組,數組中的元素能夠是基本數據和對象
Spring Boot推薦使用Java配置,可是一樣也可使用XML配置。
spring boot核心配置文件是application.properties或者application.yml。
Spring Profiles容許用戶根據配置文件(dev,test,prod等)來註冊bean。所以,當應用程序在開發中運行時,只有某些bean能夠加載,而在PRODUCTION中,某些其餘bean能夠加載。假設咱們的要求是Swagger文檔僅適用於QA環境,而且禁用全部其餘文檔。這可使用配置文件來完成。Spring Boot使得使用配置文件很是簡單。
在項目的配置文件中能夠自定義運行的端口。
application.properties
# 自定義端口 server.port = 8081
application.yml
# 自定義端口 server: port: 8081
爲了實現 Spring Boot 的安全性,咱們使用 spring-boot-starter-security 依賴項,而且必須添加安全配置。它只須要不多的代碼,配置類將必須擴展WebSecurityConfigurerAdapter並覆蓋其方法。
因爲Spring Boot官方提供了大量的很是方便的開箱即用的Starter,包括Spring Security的Starter ,使得在Spring Boot中使用Spring Security變得更加容易,甚至只須要添加一個依賴就能夠保護全部的接口,因此,若是是Spring Boot項目,通常選擇Spring Security。固然這只是一個建議的組合,單純從技術上來講,不管怎麼組合,都是沒有問題的。Shiro和Spring Security相比,主要有以下一些特色:
1)Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架
2)Spring Security 概念複雜,配置繁瑣;Shiro 概念簡單、配置簡單
3)Spring Security 功能強大;Shiro 功能簡單
跨域能夠在前端經過JSONP來解決,可是JSONP只能夠發送GET請求,沒法發送其餘類型的請求,在 RESTful風格的應用中,就顯得很是雞肋,所以咱們推薦在後端經過(CORS,Cross-origin resource sharing) 來解決跨域問題。這種解決方案並不是Spring Boot特有的,在傳統的SSM框架中,就能夠經過 CORS來解決跨域問題,只不過以前咱們是在XML文件中配置 CORS ,如今能夠經過實現WebMvcConfigurer接口而後重寫addCorsMappings方法解決跨域問題。
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
項目中先後端分離部署,因此須要解決跨域的問題。咱們使用cookie存放用戶登陸的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。當用戶登陸之後,正常使用;當用戶退出登陸狀態時或者token過時時,因爲攔截器和跨域的順序有問題,出現了跨域的現象。咱們知道一個http請求,先走filter,到達servlet後才進行攔截器的處理,若是咱們把cors放在filter裏,就能夠優先於權限攔截器執行。
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
CSRF表明跨站請求僞造,這是一種攻擊,迫使最終用戶在當前經過身份驗證的Web應用程序上執行不須要的操做,CSRF攻擊專門針對狀態改變請求,而不是數據竊取,由於攻擊者沒法查看對僞造請求的響應。
Spring boot actuator是spring啓動框架中的重要功能之一。Spring boot監視器可幫助您訪問生產環境中正在運行的應用程序的當前狀態。有幾個指標必須在生產環境中進行檢查和監控。即便一些外部應用程序可能正在使用這些服務來向相關人員觸發警報消息。監視器模塊公開了一組可直接做爲 HTTP URL訪問的REST端點來檢查狀態。
默認狀況下,全部敏感的HTTP端點都是安全的,只有具備ACTUATOR角色的用戶才能訪問它們。安全性是使用標準的HttpServletRequest.isUserInRole方法實施的。 咱們可使用來禁用安全性。只有在執行機構端點在防火牆後訪問時,才建議禁用安全性。
Spring Boot提供監視器端點以監控各個微服務的度量。這些端點對於獲取有關應用程序的信息(如它們是否已啓動)以及它們的組件(如數據庫等)是否正常運行頗有幫助。可是,使用監視器的一個主要缺點或困難是,咱們必須單獨打開應用程序的知識點以瞭解其狀態或健康情況。想象一下涉及50個應用程序的微服務,管理員將不得不擊中全部50個應用程序的執行終端。爲了幫助咱們處理這種狀況,咱們將使用位於的開源項目。 它創建在Spring Boot Actuator之上,它提供了一個Web UI,使咱們可以可視化多個應用程序的度量。
WebSocket是一種計算機通訊協議,經過單個TCP鏈接提供全雙工通訊信道。
一、WebSocket 是雙向的 -使用 WebSocket 客戶端或服務器能夠發起消息發送。
二、WebSocket 是全雙工的 -客戶端和服務器通訊是相互獨立的。
三、單個 TCP 鏈接 -初始鏈接使用 HTTP,而後將此鏈接升級到基於套接字的鏈接。而後這個單一鏈接用於全部將來的通訊。
四、Light -與 http 相比,WebSocket 消息數據交換要輕得多。
Spring Data是Spring的一個子項目,用於簡化數據庫訪問,支持NoSQL和關係數據存儲,其主要目標是使數據庫的訪問變得方便快捷。Spring Data具備以下特色:
SpringData項目支持NoSQL存儲:
SpringData項目所支持的關係數據存儲技術:
Spring Data Jpa致力於減小數據訪問層(DAO)的開發量. 開發者惟一要作的,就是聲明持久層的接口,其餘都交給Spring Data JPA來幫你完成!Spring Data JPA經過規範方法的名字,根據符合規範的名字來肯定方法須要實現什麼樣的邏輯。
Spring Boot Batch提供可重用的函數,這些函數在處理大量記錄時很是重要,包括日誌/跟蹤,事務管理,做業處理統計信息,做業從新啓動,跳過和資源管理。它還提供了更先進的技術服務和功能,經過優化和分區技術,能夠實現極高批量和高性能批處理做業。簡單以及複雜的大批量批處理做業能夠高度可擴展的方式利用框架處理重要大量的信息。
FreeMarker是一個基於Java的模板引擎,最初專一於使用MVC軟件架構進行動態網頁生成。使用 Freemarker的主要優勢是表示層和業務層的徹底分離。程序員能夠處理應用程序代碼,而設計人員能夠處理html頁面設計。最後使用freemarker能夠將這些結合起來,給出最終的輸出頁面。
對於集成Spring Boot和ActiveMQ,咱們使用依賴關係,它只須要不多的配置,而且不須要樣板代碼。
Apache Kafka是一個分佈式發佈 - 訂閱消息系統。它是一個可擴展的,容錯的發佈 - 訂閱消息系統,它使咱們可以構建分佈式應用程序。這是一個Apache頂級項目。Kafka適合離線和在線消息消費。
Swagger普遍用於可視化API,使用Swagger UI爲前端開發人員提供在線沙箱。Swagger是用於生成 RESTful Web服務的可視化表示的工具,規範和完整框架實現。它使文檔可以以與服務器相同的速度更新。當經過Swagger正肯定義時,消費者可使用最少許的實現邏輯來理解遠程服務並與其進行交互。所以,Swagger消除了調用服務時的猜想。
先後端分離開發日益流行,大部分狀況下,咱們都是經過Spring Boot作先後端分離開發,先後端分離必定會有接口文檔,否則會先後端會深深陷入到扯皮中。一個比較笨的方法就是使用word或者md來維護接口文檔,可是效率過低,接口一變,全部人手上的文檔都得變。在Spring Boot中,這個問題常見的解決方案是Swagger ,使用Swagger咱們能夠快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,全部開發工程師訪問這一個在線網站就能夠獲取到最新的接口文檔,很是方便。
這可使用DEV工具來實現。經過這種依賴關係,您能夠節省任何更改,嵌入式tomcat 將從新啓動。Spring Boot有一個開發工具(DevTools)模塊,它有助於提升開發人員的生產力。Java開發人員面臨的一個主要挑戰是將文件更改自動部署到服務器並自動重啓服務器。開發人員能夠從新加載Spring Boot上的更改,而無需從新啓動服務器。這將消除每次手動部署更改的須要。Spring Boot在發佈它的第一個版本時沒有這個功能。這是開發人員最須要的功能。DevTools模塊徹底知足開發人員的需求。該模塊將在生產環境中被禁用。它還提供H2數據庫控制檯以更好地測試應用程序。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
首先,這個Starter並不是什麼新的技術點,基本上仍是基於Spring已有功能來實現的。首先它提供了一個自動化配置類,通常命名爲XXXAutoConfiguration ,在這個配置類中經過條件註解來決定一個配置是否生效(條件註解就是 Spring 中本來就有的),而後它還會提供一系列的默認配置,也容許開發者根據實際狀況自定義相關配置,而後經過類型安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉默認屬性。正由於如此,不少第三方框架,咱們只須要引入依賴就能夠直接使用了。固然,開發者也能夠自定義Starter。
咱們都知道,新建立一個 Spring Boot 項目,默認都是有 parent 的,這個 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有以下做用:
一、定義了 Java 編譯版本爲 1.8 。
二、使用 UTF-8 格式編碼。
三、繼承自 spring-boot-dependencies,這個裏邊定義了依賴的版本,也正是由於繼承了這個依賴,所四、以咱們在寫依賴時纔不須要寫版本號。
五、執行打包操做的配置。
六、自動化的資源過濾。
七、自動化的插件配置。
八、針對 application.properties 和 application.yml 的資源過濾,包括經過 profile 定義的不一樣環境的配 置文件,例如 application-dev.properties 和 application-dev.yml。
Spring Boot 項目最終打包成的 jar 是可執行 jar ,這種 jar 能夠直接經過 java -jar xxx.jar 命令來運行,這種 jar 不能夠做爲普通的 jar 被其餘項目依賴,即便依賴了也沒法使用其中的類。
Spring Boot 的 jar 沒法被其餘項目依賴,主要仍是他和普通 jar 的結構不一樣。普通的 jar 包,解壓後直接就是包名,包裏就是咱們的代碼,而 Spring Boot 打包成的可執行 jar 解壓後,在 \BOOT-INF\classes 目錄下才是咱們的代碼,所以沒法被直接引用。若是非要引用,能夠在 pom.xml 文件中增長配置,將 Spring Boot 項目打包成兩個 jar ,一個可執行,一個可引用。
1)直接運行main文件
2)打包用命令或放到容器中運行
3)用Maven/Gradle插件運行
能夠不須要,由於Spring Boot有內嵌服務器tomcat
1)繼承spring-boot-starter-parent項目
2)導入spring-boot-dependencies項目依賴
Spring提供了一種使用ControllerAdvice處理異常的很是有用的方法。咱們經過實現一個 ControlerAdvice類,來處理控制器類拋出的全部異常。
使用Spring Data-JPA能夠實現將可分頁的傳遞給存儲庫方法。
在微服務中,一個完整的項目被拆分紅多個不相同的獨立的服務,各個服務獨立部署在不一樣的服務器上,各自的session被從物理空間上隔離開了,可是常常,咱們須要在不一樣微服務之間共享session,常見的方案就是Spring Session + Redis來實現session共享。將全部微服務的session統一保存在Redis 上,當各個微服務對session有相關的讀寫操做時,都去操做Redis上的session 。這樣就實現了session 共享,Spring Session基於Spring中的代理過濾器實現,使得session的同步操做對開發人員而言是透明的,很是簡便。
定時任務也是一個常見的需求,Spring Boot中對於定時任務的支持主要仍是來自Spring框架。在Spring Boot中使用定時任務主要有兩種不一樣的方式,一個就是使用Spring中的@Scheduled註解,另外一個則是使用第三方框架Quartz。