# Springboot2 實戰權威指南 基礎篇
## 更新歷史
~~~
24萬+文字
200+章節
~~~
* 2017.12, 本書第一版《Spring Boot 2精髓》,由電子出版社出版
* 2019.06, 本書第二版,拆成倆部分,基礎篇和分布式篇,基礎篇通過看云發布
* 2019.0702,微調目錄結構
* 2019.0709 第二章scope文檔和例子對不上
* 2019.0715 第三章目錄缺少一節,標點符號調整
* 2019.0803 添加plus系統功能權限和數據權限開發原理
* 2019.0813 修改MyBatis一章內容,完善了MyBatis簡單使用。SpringBoot-Plus增加數據權限和配置介紹
* 2020.0607 SpringBoot 2.3最新版,并細微修訂部分內容,如SpringBoot為什么不采用SLF4J
## 寫作特色
本書是《SpringBoot 2.0 精髓》(電子工業出版社出版,定價79元)的第二版。根據第一版的反饋,有如下改進
* 書中所有內容更新到最新版本,由于本書發型采用電子版,讀者隨時可以看到最新內容,可以通過更新歷史查看是否有更新內容。Spring Boot的書很多,但大多曇花一現,本書決心打造為Spring Boot應用經典書籍
* **杜絕純理論,杜絕貼源碼行為**,[例子](https://gitee.com/xiandafu/springboot2-howto-example)緊密結合業務實戰,兼顧教學和實戰。
* **杜絕只講Spring Boot,不講Spring 生態的行為**,立刻學習,立刻使用
* 提供了較為全面的基礎知識,本書可以作為一本參考書供開發中使用,有些知識限于篇幅沒有深度講解,但可以作為解決你的系統問題的一個思路
* 介紹了[SpringBoot-plus](https://gitee.com/xiandafu/springboot-plus) 開發平臺,一個正真的開發平臺內核系統,可以作為每個軟件公司后臺項目腳手架
* 增加了選型分析,Springboot 繼承了很多框架,每章涉及到多個框架選型會做出一定個人分析,比如為什么SpringBoot 會推薦HikariCP,推薦Jackson。
* 更多介紹了微服務和分布式介紹
* 更多介紹Redis, 考慮到Redis 應用更加普遍,同時也介紹了JVM緩存caffeine,caffeine+redis,一對互聯網高并發應用的黃金搭檔
* 對一些Spring基礎知識也較第一版本做了大幅度增強,滿足高級開發者的使用需求。比如AOP,事務管理。本書改動幅度大約20%,隨著用戶反饋,會逐漸調整
* 由于出版的是電子版,所以有更多個人技術上的見解可以寫在書里,能幫助更多初學者選型技術,以及知道如何選型技術
本書并不是一本Spring原理書或者SpringBoot 2的源碼解析書,本書緊貼SpringBoot 2實戰和定制開發,如果你是想立即使用SpringBoot2,只需本書一本就夠了,而不像其他Spring Boot書要分好幾本買,看數千頁的資料才能編寫Spring Boot 實戰項目。《Springboot 2 實戰權威指南》 是最好的選擇
本書聚焦Spring Boot技術和相關生態,分布式技術。如果你想了解Spring Cloud,你需要一本專業還有更厚的書
本書適合那些Java初學者,或者從其他語言轉向Java,也適合了解Spring,Struts等web框架,想改用Spring Boot的架構師,如果你已經對Spring Boot2 有所了解,本書也可以幫你拓寬知識面,了解Spring Boot2的原理和其依賴庫的選型依據
## 免費閱讀
第一章提供免費閱讀
最后一章12.1,12.2,12.3,12.4.1 章節提供免費閱讀
## 示例工程
本書的所有例子都直接訪問[碼云](https://gitee.com/xiandafu/springboot2-howto-example)或者ibeetl.com網站獲取書中代碼,網站還提供了關于Spring Boot 更深入的例子,并且包括倆個實用的例子,一個是采用Spring Boot 構建的輕量級[BBS](https://gitee.com/xiandafu/beetl-bbs),還有一個企業應用腳手架的完整例子[Spring Boot Plus](https://gitee.com/xiandafu/springboot-plus) ,這倆個例子被國內很多中小企業再次定制使用。本書會介紹Spring Boot Plus項目
歡迎與作者互動,完善本書和示例
## 作者介紹
李家智,網名閑大賦,是國內Beetl,BeetlSQL等基礎軟件開源作者,工作了19年Java編程,至今還在一線開發。經常發表博客,技術見解。
現定居北京,曾在一流的電信廠商,外企干過,也在一流的互聯網電商干過,熟悉JavaEE,熟悉Spring,熟悉分布式,最后一家是京東交易中臺架構組,負責分布式系統架構升級和優化
有任何SpringBoot和周邊生態技術的問題,歡迎加入QQ群252010126 討論.
歡迎關注我的公眾號

## 基礎篇內容介紹
上半部分,介紹Spring Boot基礎技術 ,http://www.hmoore.net/xiandafu/springboot2-in-practice
* 第一章,如果不知道Java開發框架歷史,很難理解Spring Boot。本書第一章 介紹Java EE,然后指出其缺點,引入了流行的Spring,同時也說明Spring這么多年發展后的一些缺點,從而介紹Spring Boot,并以倆個簡要例子作為說明。
* 第二章:對Spring Boot應用的開發環境做了說明,包括Java開發環境安裝和配置,包含了Eclipse和Idea,以及Maven安裝和配置,設置國內倉庫鏡像。
* 第三章: 詳細介紹MVC技術,重點介紹URL映射到Contorller,以及映射到Controller 方法的參數,附件上傳,參數類型轉化,參數驗證。
* 第四章:對視圖層介紹,分為倆部分,一部分是Jackson,性能最好,功能最全的Json序列化工具,Spring Boot不僅僅將Jackson作為MVC中的JSON默認和推薦工具,也是Spring Boot分布式技術中常采用的JSON序列化技術。第二部分 介紹了筆者的開源技術Beetl后端模板引擎,作為國內最為流行的模板引擎之一,也是當今世界性能最好,功能最全的文本處理引擎。廣泛應用到國內各大公司。
* 第五章: 介紹了以面向對象為中心的數據庫訪問工具Spring Data JPA。本章由易到難,先從Spring Data提供的功能入手介紹如何完成數據庫簡單的增刪改查功能,然后引入JPA來解決應用中不可避免的復雜SQL查詢。
* 第六章 介紹了以SQL為中心的數據庫訪問工具,主要包含兩款,一個是流行多年通過XML來管理SQL的Mybatis,以及輔助工具MyBatis-Plus。另外一個是筆者的Dao工具,SQL在markdown文件中管理,內置增刪改查,無需輔助插件。以SQL為中心的數據庫訪問工具, 適合那些更喜歡SQL方式訪問數據庫的開發者。
* 第七章:介紹了MyBatis-Plus系統集成,本章不會深入MyBatis使用,因為那需要一本書才能說明白,本節內容由MyBatis-Plus作者提供。
* 第八章:介紹Spring Boot高級特性,如常用Spring Boot的配置,日志配置,應用配置的讀取,Spring Boot自動裝配技術,Spring Boot Stater實現。
* 第九章: 介紹了如何部署Spring Boot應用,包括可執行jar,以及通過war部署到應用服務器上。應用經常面對多個環境,如開發,測試,還有準線上,線上,以及多個Demo環境,Spring Boot提供Profile來實現多環境部署
* 第十章:介紹了單元測試概念,以及SpringBoot下的單元測試支持,包括MVC單元測試,Mock測試。
* 第十一章:考慮到Spring Boot 以Spring技術為從基礎,本章會再次深入介紹IOC,AOP和事務處理
* 第十二章:介紹[Spring Boot2 Plus](https://gitee.com/xiandafu/springboot-plus)項目安裝和核心模型,代碼生成功能,權限設計。
## 分布式篇介紹
介紹Spring Boot與分布式相關技術 http://www.hmoore.net/xiandafu/springboot2inpractice_distributed
* 第十三章: 分布式和微服務概念。Spring Boot并不是一個微服務架構,但是一個微服務體系中中做的最好的單體系統,本書介紹分布式和微服務概念,挑戰和缺陷。
* 第十四章: 介紹RESTFul風格的架構,然后介紹SpringBoot如何集成以提供REST服務,使用RestTemplate調用REST服務。本章最后也重點介紹了Swagger3.0技術,以方便REST的接口的交流,開發和測試。
* 第十五章:介紹了Redis服務器的安裝和使用,Redis常用數據結構和操作命令。然后介紹Spring Boot如何集成Redis,介紹使用RedisTemplate來操作Redis。章節后半部分深入介紹了RedisTemplate提供的序列化機。相對于第一版,本版會深入介紹Reids在互聯網中的適用
* 第十六章,介紹了ElasticSearch的安裝和使用,ElasticSearch是一個即具有全文搜索功能,也具備NOSQL的功能。本章介紹通過REST和Spring Data 倆中方式訪問Elastc Search. 相對第一版,本章會深入介紹Elastic 在互聯網中的應用。
* 第十七章: 介紹SpringBoot Cache功能,并重點介紹了Redis作為分布式緩存的實現。在此基礎上,改進了Redis分布式緩存,通過較少的代碼實現了一個具備一二級緩存的技術。
* 第十八章:Spring Boot應用水平擴展,須實現無會話狀態技術,Spring Session提供了分布式會話管理,本章介紹了Nginx作為反向代理,以及Spring Session的Reids實現及其源碼分析
* 第十九章: 基于前一章Spring Boot應用水平擴展技術必然帶來分布式協調 要求,Zookeeper是一個廣泛使用的分布式協調器。本章介紹Zookeeper的安裝和使用,對領導選取,分布式鎖和配置三個常用功能做了重點描述,并在SpringBoot 應用中采用curator來完成這三個功能。
* 第二十章:Spring Boot提供了內置監控功能,使得用戶通過HTTP請求就能知曉服務器健康狀態,如數據源是否可用,NOSQL服務是否可用,最近的HTTP訪問的內容等監控信息。本章講述了線程棧,內存,在線日志,HTTP訪問,Request Mapping等常用監控功能。其中講述通過dump線程棧和內存來解決SpringBoot應用中的一些性能故障。
* 第二十一章: 再次介紹了SpringBoot-Plus,主要包含使用到的Spring Cache和Spring Session。
## 微服務篇(敬請期待)
## 同事和開源作者的推薦:
過去幾年,微服務架構在軟件開發領域逐漸深入人心,Spring Boot在經歷了快速演變之后,正在成為Java微服務開發的主流成熟框架。本書對Spring Boot的特性進行全方位講解,輔以大量詳實的案例,對分布式系統開發和應用提供實戰指導。書中還詳細介紹了作者傾注了大量心血研發的開源軟件Beetl和BeetlSQL,它們易于與Spring Boot集成,并已被眾多大公司采納使用。本書對于開發人員和架構師來說,都極具參考價值。
—《Kubernetes權威指南》作者/HPE高級顧問 龔正
和家智相識多年,他是我所認識的非職業足球運動員中球商最高的,多年來他一直深耕于技術的第一線,有很豐富的技術儲備,是我非常欽佩的老大哥。
我們曾經在同一家公司的同一個項目集效力,都非常喜歡踢球,都出了書,不得不說很神奇(作者注:其實和龔正也在同一個公司,同一個項目效力)。
這本書的內容非常豐富,也都是作者多年潛心鉆研的積累,這本書和我的書有一些聯系,將Spring Boot進行了展開的講解,既有廣度也有深度,非常值得技術人員去學習。
—《微服務那些事兒》作者紀曉峰
Spring Boot上手簡單、功能豐富、易于擴展,可謂目前業界快速開發、快速生產的利器;然而,它的版本演進非常迅速,中文文檔質量也是參差不齊。本書由淺入深地講解了Spring Boot,幫助讀者系統理解Spring Boot。不僅如此,本書對2.0版本帶來的新特性亦有非常詳盡的描述,絕對值得一讀。
—《Spring Cloud與Docker微服務架構實戰》作者 周立
和家智相識有五年了,最早是因為模板引擎技術結識。家智是國內頂級的模板引擎專家,也是我認識的為數不多的 Spring 技術專家,他在這兩方面都曾帶給我不同角度的思考與印證,讓我獲益匪淺。本書是家智二十年技術專研的一次厚積薄發,其中非但從作者自身的經驗詳細講述了 Spring Boot框架,還引入了作者在模板引擎,ORM 以及單元測試方面上多年研發的開源作品,是 Java 程序員和架構師不可多得的參考資料
— ACTFramework 作者 羅格林
十多年前,Spring 顛覆了傳統的 JavaEE 技術,迎來了 Java 企業級應用開發的春天,然而今天的 Spring Boot 卻站在 Spring 巨人的肩膀上,讓我們可以更高效地開發與交付。李家智是著名開源框架 Beetl 的作者,他寫的《Spring Boot 2.0 精髓》一定非常精彩。
— 黃勇,特贊科技 CTO
最早熟知作者是從Beetl模板引擎開始的,當時正在尋找一個易用高效的模板引擎,Beetl幾乎滿足了我所有的需要。同時也對作者在開源項目上的認真與負責所敬佩。本書可以說是作者多年的心血所著,從Spring boot的前世今生到使用擴展,都做了非常全面而易懂的概括,細節上也秉承了作者的細致與認真,講解清晰并語言干練,既適合初學者系統化學習,也適合有經驗的工程師做為參考。
— 開源工具集Hutool作者 路小磊
從事web開發有些年頭了,經過技術選型,spring boot走入了我們的視野,開箱即用,非常方便,也是目前很多大公司的選擇之一。除了研究源碼,如果有一本關于SpringBoot的指導書籍,則可以極大方便的解決開發中的問題和幫助掌握SpringBoot,提高生產效率。
家智兄的這本書正是這樣不可多得的優秀資源,是家智兄多年鉆研研究的技術積累,書中詳細講解了web開發的各個知識點,包含:web請求處理,ORM處理,redis緩存,MongoDB,ElasticSearch,Zookeeper,監控等方面的知識點。相信讀者通過仔細閱讀并掌握本書的知識點,可以極大的提高自身的web開發水平,為讀者的軟件開發事業助一臂之力!
— 上海秦蒼(買單俠) 基礎架構組架構師 劉志強
作者在Java EE體系內的多年實戰經驗使得本書的內容極具價值,書中清晰細致的講解了快速構建Web應用系統的各個知識點,尤其是在后端模板引擎和ORM兩個章節中作者以自己的兩款成熟開源產品Beetl和BeetlSQL為切入點進行講解,剖析角度十分新穎并且有啟發性。
通過這本書可以學習到關于Spring Boot框架的核心技術,從而掌握快速構建分布式Web應用的必備知識。無論你是Spring Boot新手,還是已經使用過Spring Boot的開發者,相信都可以從這本書中受益。
— XXL-JOB系列作者 許雪里
近兩年來,伴隨著微服務興起,Spring boot突然流行起來了,越來越多的公司采用這一技術,已經成為大多數Java微服務開發首選開源框架。Spring boot有非常顯著的特點配置簡單,易于開發,可快速部署,本書結合豐富的實例,從Spring boot的快速開發WEB應用入手,逐漸深入的到Spring boot的高級特性,最后在重點介紹分布式架構的應用,通過深入淺出的闡述,讓你從單體應用到分布式,微服務都有全方位的了解,是不可多得的一本好書,當然我認為最重要的還是作者耗費心血開源項目Beetl和BeetlSQL。
—《分布式數據庫架構及企業實踐——基于Mycat中間件》作者,開源中間件Mycat負責人 周繼鋒
Spring風靡多年,Spring Boot在最近幾年微服務框架浪潮下更是出盡風頭,本書作者由淺入深地把Spring Boot 2.0各種特性闡述得淋漓盡致,不管你是Spring Boot新手還是老司機都值得一讀。Java Web后端也好,App后臺也罷,甚至獨立后臺應用,等等,Spring Boot都是你不可或缺的高效率工具。
移動易項目團隊深深的體會就是使用了Spring Boot可以節省50%以上的代碼。
— 上海億琪軟件有限公司CEO,移動易開源項目負責人,華為開發者社區專家(HDE),褚建琪
- 再版說明
- 1 前言
- 1.1 內容介紹
- 1.2 Java EE
- 1.2.1 Java EE 架構
- 1.5 如何閱讀本書
- 1.6 本書第二版與第一版區別
- 1.7 本書例子
- 1.8 購買正版
- 2 Spring Boot 基礎
- 2.1 檢查Java環境
- 2.2 安裝IDE
- 2.3.1 安裝Eclipse
- 2.3.2 安裝Idea
- 2.3.3 Idea和 Eclipse 區別
- 2.3 Maven安裝和配置
- 2.3.1 Maven介紹
- 2.3.2 安裝Maven
- 2.3.3 pom文件構成
- 2.3.4 設置Maven鏡像
- 2.3.5 IDE設置Maven
- 2.4 Spring框架
- 2.4.1 Spring 歷史
- 2.4.2 Spring 容器介紹
- 2.4.3 Spring 常用注解
- 2.5 Hello,Spring Boot
- 2.5.1 創建一個Maven工程
- 2.5.2 增加Web支持
- 2.5.3 hello world
- 2.5.4 使用熱部署
- 2.5.5 添加Rest支持
- 2.5.6 配置HTTP監聽端口
- 3 MVC框架
- 3.1 集成MVC框架
- 3.1.1 引入依賴
- 3.1.2 Web應用目錄結構
- 3.1.3 Java 包名結構
- 3.2 使用Controller
- 3.3 URL 映射到方法
- 3.3.1 @RequestMapping
- 3.3.2 URL路徑匹配
- 3.3.4 HTTP method匹配
- 3.3.5 consumes和 produces
- 3.3.6 params和header匹配
- 3.4 方法參數
- 3.4.1 PathVariable
- 3.4.2 Model&ModelAndView
- 3.4.3 JavaBean接收HTTP參數
- 3.4.4 @RequsestBody接收JSON
- 3.4.5 MultipartFile
- 3.4.6 @InitBinder
- 3.5 驗證框架
- 3.5.1 JSR-303
- 3.5.2 MVC中使用@Validated
- 3.5.3 自定義校驗
- 3.6 WebMvcConfigurer
- 3.6.1 攔截器
- 3.6.2 跨域訪問
- 3.6.3 格式化
- 3.6.4 注冊Controller
- 3.7 Redirect 和 Forward
- 3.8 通用錯誤處理
- 3.9 異步請求
- 3.10 處理靜態資源
- 3.11 調用Service
- 3.11.1 申明一個Service類
- 3.11.2 事務管理
- 3.12 CURL 命令
- 4 視圖技術
- 4.1 Json技術
- 4.1.1 SpringBoot中使用Jackson
- 4.1.2 配置Jackson
- 4.1.3 Jackson三種使用方式
- 4.1.4 Jackson 樹遍歷
- 4.1.5 對象綁定
- 4.1.6 流式操作
- 4.1.7 Jackson 注解
- 4.1.9 集合的反序列化
- 4.1.10 關于Jackson性能說明
- 4.2 Beetl模板引擎
- 4.2.1 安裝Beetl
- 4.2.2 設置定界符號和占位符
- 4.2.3 自動檢測模板變化
- 4.2.4 GroupTemplate
- 4.2.5 使用變量
- 4.2.6 表達式
- 4.2.7 控制語句
- 4.2.8 函數調用
- 4.2.9 格式化函數
- 4.2.10 直接調用Java
- 4.2.11 標簽函數
- 4.2.12 HTML標簽
- 4.2.13 安全輸出
- 4.2.14 配置Beetl
- 4.2.15 布局
- 4.2.16 驗證模板
- 4.2.17 腳本引擎
- 4.2.18 為什么選擇Beetl
- 5 數據庫訪問
- 5.1 配置數據源
- 5.2 Hikari 配置選項
- 5.3 JDBC Template
- 5.3.1 查詢
- 5.3.2 修改
- 5.3.3 JdbcTemplate 增強
- 5.3 Spring Data JPA 支持
- 5.3.1 創建Entity
- 5.3.2 簡化Entity
- 5.3.3 Repository
- 5.3.4 CrudRepository
- 5.3.5 PagingAndSortingRepository
- 5.3.6 JpaRepository
- 5.3.7 持久化Entity
- 5.3.6 Sort
- 5.3.7 Pageable和 Page
- 5.3.8 基于方法名字查詢
- 5.3.9 @Query 查詢
- 5.3.10 使用JPA Query
- 5.3.11 Example 查詢
- 5.3.12 一個使用JPA糟糕回憶
- 6 BeetlSQL
- 6.1 BeetlSQL 特點
- 6.2 配置BeetlSQL
- 6.3 一個例子
- 6.3.1 創建實體對象
- 6.3.2 創建Dao
- 6.3.3 編寫Service
- 6.3.4 編寫一個復雜的SQL
- 6.4 SQLManager
- 6.5 Mrakdown 文件
- 6.6 跨數據庫
- 6.6 翻頁查詢
- 6.7 實體對象和多表結果集
- 6.8 直接使用SQL
- 6.9 Query 類
- 6.10 代碼生成
- 6.11 BeetlSQL函數
- 6.11 一些重要注解
- 6.11.1 @Table
- 6.11.2 @Version
- 6.11.3 @SqlResource
- 6.11.4 @SqlProvider
- 6.11.5 自定義注解
- 6.12 重要配置事項
- 6.13 擴展BeetlSQL
- 6.14 主從支持
- 6.15 最佳實踐
- 7 MyBatis
- 7.1 Spring Boot 集成
- 7.2 編寫Mapper文件
- 7.2.1 查詢
- 7.2.2 更新語句
- 7.2.4 SQL片段
- 7.3 動態SQL
- 7.4 MyBatis-Plus集成
- 8 Spring Boot 配置
- 8.1 SpringBoot 配置
- 8.1.1 服務器配置
- 8.1.2 使用其他Web服務器
- 8.1.3 配置啟動信息
- 8.1.4 配置瀏覽器顯示ico
- 8.2 日志配置
- 8.3應用配置讀取
- 8.3.1 Environment
- 8.3.2 @Value
- 8.3.3 @ConfigurationProperties
- 8.4 SpringBoot 自動裝配
- 8.4.1 @Configuration和@Bean
- 8.4.2 Bean條件裝配
- 8.4.3 Class 條件裝配
- 8.4.4 Environment裝配
- 8.4.5 其他條件裝配
- 8.4.6 聯合多個條件
- 8.4.7 Condition接口
- 8.4.8 制作Stater
- 8.5 Application.properties
- 8.6 其他配置
- 8.6.1 靜態文件配置
- 8.6.2 熱啟動配置
- 8.7 HikariCP配置
- 9 部署Spring Boot 應用
- 9.1 以Jar文件運行
- 9.2 以war方式部署
- 9.3 多環境部署
- 9.4 @Profile
- 9.5 Launcher
- 10 Testing 單元測試
- 10.1 JUnit 介紹
- 10.1.1 Junit相關概念
- 10.1.2 Junit 測試
- 10.1.3 Assert
- 10.1.4 Suite
- 10.2 Spring Boot 單元測試
- 10.2.1 測試范圍依賴
- 10.2.2 SpringBoot 測試腳手架
- 10.2.3 測試Service
- 10.2.4 測試MVC
- 10.2.5 完成MVC請求模擬
- 10.2.6 比較 MVC返回結果
- 10.2.7 JSON 比較
- 10.3 Mockito
- 10.3.1 模擬對象
- 10.3.2 模擬方法參數
- 10.3.3 模擬方法返回值
- 10.4 @Sql
- 11 AOP和事務
- 11.1 AOP
- 11.2 事務和Spirng 事務管理
- 11.2.1 事務處理
- 11.2.2 隔離保護
- 11.2.3 Spring Boot 事務管理
- 11.2.4 分布式事物
- 12 Spring Boot Plus 安裝
- 12.1 代碼工程
- 12.2 單體系統到系統拆分
- 12.3 安裝
- 12.4 核心模型
- 12.4.1 Function
- 12.4.2 Menu
- 12.4.3 Role
- 12.4.4 User表
- 12.4.5 數據字典表
- 12.4.6 審計表
- 12.5 代碼生成
- 12.5.1 子系統生成
- 12.5.1 配置子系統
- 12.5.2 業務代碼生成
- 12.6 權限系統原理
- 12.6.1 功能權限
- 12.6.2 數據權限
- 12.6.3 加密
- 12.7 Plus的配置類