前兩天剛上班,然後就被我們的直屬老大叫去分組搞定一些技術,出品成文檔在所有人之間傳閱學習。於是我和其餘倆個小夥同心協力之下搞出了一份成品。其他兩個小夥伴很給力。沒有他們,無法有這份文檔。雖然有些粗略,但還是希望能給大家有所幫助。
Spring Boot學習文檔
文檔說明:標有淺灰色背景內容爲擴展內容,忽略閱讀不影響學習Spring Boot的使用。
一. 爲什麼選擇Spring Boot
隨着動態語言的流行(Ruby、Groovy、Scala、Node.js),java的開發顯得格外的笨重,
繁多的配置、低下的開發效率、複雜的部署流程以及第三方技術集成難度大。
在上述環境下,Spring Boot應運而生。它使用“習慣優於配置”(項目中存在大量的配
置,此外還內置一個習慣性的配置,讓你無需手動進行配置)的理念讓你的項目快速運行起來。使用Spring Boot很容易創建一個獨立運行(運行jar,內嵌Servlet容器)、準生產級別的基於Spring框架的項目,使用Spring Boot你可以不用或者只需要很少的Spring配置。
1.spring boot的優缺點
(1)優點:
1、快速構建項目。
2、對主流開發框架的無配置集成。
3、項目可獨立運行,無須外部依賴Servlet容器。
4、提供運行時的應用監控。
5、極大的提高了開發、部署效率。
6、與雲計算的天然集成。
(2)缺點:
1、如果你不認同spring框架,也許這就是缺點。
二.idea快速搭建spring boot項目+原理解析
1. 創建簡單web項目(沒有連接數據庫)
第一步:點擊File—>New—>Project… 彈出以下頁面
第二步:點擊上圖所示的“1”即Spring Initializr即可創建spring boot應用,“2”和“3”保持默認即可,點擊Next進入下一步。
注意:IntelliJ IDEA的商業版本是自帶這個選項功能的,但是社區版本是沒有這個選項的,需要另外安裝插件“Spring Assistant”。關於商業版IntelliJ IDEA的破解方法在文檔末尾會有說明。
第三步:Next之後進入頁面,這些便是傳統創建maven工程的選項了,相信大家不會陌生。
註釋:首先,SpringBoot
應用是可以打包成JAR
或者WAR
形式的。但是官方文檔推薦的是打包成JAR
,作爲一個web
應用
,爲什麼會推薦打包成JAR
,這是因爲SpringBoot
內集成了Tomcat
服務器,當你啓動SpringBoot
應用的時候,內置的Tomcat
服務器就會啓動,加載web
應用
。這個可以從啓動SpringBoot
項目的時候從控制檯的日誌中可以看出,如下:
第四步:上圖填完點擊Next,變到了比較重要的一個頁面
首先,我們創建一個簡單的可以通過瀏覽器輸入http://localhost:8080/訪問的簡單web應用,所以我們依次點擊最左邊的“Web”,再勾選中間的“Web”,接着點擊Next。這個頁面在接下來需要創建連接數據庫的web應用時還會講到。
第五步:默認項目名稱,還有根據需要選擇項目存放路徑,點擊“Finish”便可以創建一個Spring boot應用了。
成功創建後目錄結構如下:
第七步:運行,點擊src下的main目錄裏的SpringBootDemoApplication文件或者test下的SpringBootDemoApplicationTests文件都可以運行測試。
運行後顯示以下類似圖案並且無報錯信息便算搭建成功。
註釋:在我們創建過程中碰到一個問題也分享一下,就是當我們右鍵點擊這個main方法的類時,並沒有找到執行這個應用的選項,即沒有Run方法,這時候點擊下示按鈕便可設置出來。
點擊後彈出下列頁面,點擊左邊的Module,設置右邊的內容,詳細原理請看:http://blog.csdn.net/bug_moving/article/details/62217017
2. 創建不簡單的web項目(Spring Boot集成Mybatis)
俗話說,一切不連數據庫的web應用都是耍流氓。Spring Boot集成Mybatis的web應用創建過程與前面大致相同,但是,唯一不同的是,在第四步上。
這一頁要勾選三個,分別是“Web”、“MySQL”和“MyBatis”。
第一步:創建數據表
表名: user
id | BigInt | Primary key | 用戶編號 |
name | Varchar(32) | Not null | 用戶名 |
age | Int(3) | Not null | 年齡 |
第二步:創建對應實體類:
第三步:創建mapper接口文件
package com.facebank.springbootmybatis.mapper; @Repository public interface UserMapper { /** * 查詢所有用戶 * @return */ @Select("SELECT * FROM user") List<User> findAll(); /** * 查詢總記錄數 * @return */ @Select("SELECT COUNT(*) FROM user") Long findCount(); /** * 通過姓名模糊查詢對應用戶 * @param name * @return */ @Select("SELECT * FROM user WHERE name LIKE \"%\"#{name}\"%\"") List<User> findByName(String name); /** * 插入/新增新用戶 * @param user * @return */ @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") int saveUser(User user); /** * 更新用戶信息 * @param user * @return */ @Update("UPDATE user SET name = #{name},age = #{age} WHERE id = #{id}") int updateUser(User user); /** * 根據用戶id刪除用戶信息 * @param id * @return */ @Delete("DELETE FROM user WHERE id = #{id}") int deleteById(Integer id); } |
值得注意的是可以通過註解實現dao層的構建,摒棄了傳統使用一個Mapper類對應一個Xml文件的繁雜方式,有時候還會因爲找不到對應業務的方法在哪而平白浪費開發時間,降低開發效率。與此對比的是,這種註解的方式可以一一對應查看修改,清晰。
在這個接口上方使用了兩個註解,分別是@Mapper和@Repository
(1)@Mapper:這個註解是爲了Spring Boot的自動配置機制使用的,通過它可以讓整個環境找到這個mapper接口,從而實現數據庫的連接和數據獲取。
(2)@Repository:這個註解則是爲了讓Service層在調用mapper時,需要使用@Autowired註解自動注入這個mapper,若沒有,則直接編譯錯誤,報Could not found錯誤。
增刪改查對應着四個註解
(3)@Insert
(4)@Delete
(5)@Update
(6)@Select
可以發現,在註解的括號中書寫SQL,若是基本類型或者是基本類型的包裝類型,則直接對應參數名稱在sql中用#{xxx}的方式注入。若是自定義類型(例如User),則也可直接使用自定義類型中的屬性變量名稱在sql中以#{xxx}注入,而不是#{user.xxx}。
第四步:創建service接口
package com.facebank.springbootmybatis.service; |
第五步:創建service接口對應實現類
package com.facebank.springbootmybatis.service.impl; |
第六步:創建Controller
package com.facebank.springbootmybatis.controller; |
註釋:這裏可以看到,相對於SpringMVC傳統使用@Controller(value=’’,method= RequestMethod.POST) 這種在括號中設置Post或者Get或者其他請求方式的書寫方式。Spring Boot提供了更爲清晰的註解來分別區分開來。
(1)@GetMapping 對應Get請求,例如查詢數據等業務
(2)@PostMapping 對應Post請求,例如添加/保存數據等業務
(3)@PutMapping 對應更新數據等業務
(4)@DeleteMapping 對應刪除數據等業務
第七步:測試
首先,點開SpringbootMybatisApplication類,右鍵或者菜單上點擊運行。
然後,點擊Tools à Test RESTful webservice 即可打開idea自帶的測試web應用的框架。
增—訪問地址:http://localhost:8080/user/saveUser
測試結果:
數據庫也毫無問題,Good Job!
同理:
刪:http://localhost:8080/user/deleteById/5
改:http://localhost:8080/user/updateUser
查:http://localhost:8080/user/findAll
以上測試均無問題。期待你自己run一次。
本程序可上Github拷貝參考,最好就自己做一遍啦。
https://github.com/KrishnnaOUT/spring-mybatis.git
Spring Boot 靜態資源訪問
關於Spring Boot項目,它與傳統項目不同的是,傳統項目的頁面和css、js等靜態資源都是放在WEB-INF下的。當然,css和js也有放在跟WEB-INF同級目錄下的。當然,這不是我們討論的重點。
Spring Boot應用則是別具一格。他的css、js等靜態資源都放置在src/main/resouces下的static目錄下。注意:這個static目錄就是訪問的根目錄。舉個例子,在static目錄中放一張圖片A.jpg,那麼啓動程序後,在瀏覽器輸入http://localhost:8080/A.jpg即可訪問到該圖片。
除此之外。SpringBoot是不支持Jsp的,這是因爲JSP在內嵌的Servlet的容器上運行有一些問題(內嵌Tomcat、Jetty不支持以jar形式運行JSP,Undertow不支持JSP)。
那該怎麼辦呢。很遺憾的是,唯有學習才能繼續開發了。SpringBoot提供了大量模板引擎,包含括FreeMarker、Groovy、Thymeleaf、Velocity和Mustache,Spring Boot中推薦使用Themeleaf作爲模板引擎,因爲Thymeleaf提供了完美的Spring MVC的支持。
而這些Thymeleaf文件(實際上是後綴爲.html的文件)放置在templates目錄下的。
3. 相關原理分析
(一)註解分析
(1) @EnableConfigurationProperties:自動映射一個pojo到springboot的配置文件(默認是application.properties文件)的屬性集。
(2) @RestController:它繼承自@Controller註解,放在表現層,我們都知道,返回json需要@ResponseBody和@Controller配合來標識當前類是一個控制器servlet,@RestController可以代替以上兩個註解來使用。而開發rest服務的時候就要使用@RestController。
(3) @SpringBootApplication:是springboot最重要的一個註解,用於快捷配置啓動類。源碼說明它只是一個配置文件類,它會被@ComponentScan掃描到。源碼如下:
分析:可以知道,在@SpringBootApplication註解裏比較重要的是這個三個註解:@Configuration、@EnableAutoConfiguration
、@ComponentScan。即若不使用@SpringBootApplication
使用以上三個註解一樣可以達到同樣的目的。
使用方法:當用idea創建Spring Boot項目時,便自動在主包下創建好了這個配置類。直接便可以運行。它會自動掃描所在類的同級包以及下級包裏的Bean(若爲JPA項目還可以掃描標註@Entity的實體類)。建議入口類放置的位置在groupId+arctifactID組合的包名下。
排除配置類:若有時候多個配置類存在,而我們想要關閉特定的自動配置應該使用@SpringBootApplication註解的exclude參數,例如:@SpringBootApplication(exclude={myConfiguration.class})
(4) @EnableAutoConfiguration:讓Spring Boot 根據類路徑中的jar包依賴爲當前項目進行自動配置。簡單來說,以前我們都是通過手動集成各種xml配置文件,然後在WEB-INF下的web.xml手動填寫一下配置的位置來註冊。而Spring Boot通過這個簡單的註解讓這一切都給你自動配置好了,是不是很貼心。
例如:添加了spring-boot-starter-web依賴,會自動添加Tomcat和Spring MVC的依賴,那麼Spring Boot會對Tomcat和Spring MVC進行自動配置。
(二)Spring Boot的配置文件
Spring Boot使用一個全局的配置文件Application.yml 或者Application.properties,放置在src/main/resources目錄或者類路徑的/config下。
Spring Boot不僅支持常規的properties配置文件,還支持yaml語言的配置文件,yaml是以數據爲中心的語言,在配置數據的時候具有面向對象的特徵。
Spring Boot的全局配置文件的作用是對一些默認配置的配置值進行修改。如修改Tomcat默認的端口號,並將默認的訪問路徑“/”修改爲“/helloboot”,可以在Application.properties中添加以下代碼即可:
該文件還是設置數據源、數據庫連接池的地方。如下。
(三)pom.xml
(1)spring-boot-starter-parent
註釋:Maven的用戶可以通過繼承spring-boot-starter-parent項目來獲得一些合理的默認配置。這個parent提供了以下特性:
- 默認使用Java 8
- 使用UTF-8編碼
- 一個引用管理的功能,在dependencies裏的部分配置可以不用填寫version信息,這些version信息會從spring-boot-dependencies裏得到繼承。
- 識別過來資源過濾(Sensible resource filtering.)
- 識別插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).)
- 能夠識別application.properties和application.yml類型的文件,同時也能支持profile-specific類型的文件(如: application-foo.properties and application-foo.yml,這個功能可以更好的配置不同生產環境下的配置文件)。
- maven把默認的佔位符${…}改爲了@..@(這點大家還是看下原文自己理解下吧,我個人用的也比較少
since the default config files accept Spring style placeholders (${…}) the Maven filtering is changed to use @..@ placeholders (you can override that with a Maven property resource.delimiter).)
(2)starter pom
本項目中使用到以下starter pom:
<dependency> <dependency> |
Spring Boot爲我們提供了簡化企業級開發絕大多數場景的starterpom, 只要使用了應用場景所需要的starterpom, 相關的技術配置將會刪除,就可以得到SpringBoot爲我們提供的自動配置的Bean。簡單來說,他幫我們封裝好了,就等着我們在pom文件中添加依賴就可以用了。
1. 官方starter pom
名稱 | 描述 |
spring-boot-starter | 核心Spring Boot starter,包括自動配置支持,日誌和YAML |
spring-boot-starter-actuator | 生產準備的特性,用於幫你監控和管理應用 |
spring-boot-starter-amqp | 對”高級消息隊列協議”的支持,通過spring-rabbit實現 |
spring-boot-starter-aop | 對面向切面編程的支持,包括spring-aop和AspectJ |
spring-boot-starter-batch | 對Spring Batch的支持,包括HSQLDB數據庫 |
spring-boot-starter-cloud-connectors | 對Spring Cloud Connectors的支持,簡化在雲平臺下(例如,Cloud Foundry 和Heroku)服務的連接 |
spring-boot-starter-data-elasticsearch | 對Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch |
spring-boot-starter-data-gemfire | 對GemFire分佈式數據存儲的支持,包括spring-data-gemfire |
spring-boot-starter-data-jpa | 對”Java持久化API”的支持,包括spring-data-jpa,spring-orm和Hibernate |
spring-boot-starter-data-mongodb | 對MongoDB NOSQL數據庫的支持,包括spring-data-mongodb |
spring-boot-starter-data-rest | 對通過REST暴露Spring Data倉庫的支持,通過spring-data-rest-webmvc實現 |
spring-boot-starter-data-solr | 對Apache Solr搜索平臺的支持,包括spring-data-solr |
spring-boot-starter-freemarker | 對FreeMarker模板引擎的支持 |
spring-boot-starter-groovy-templates | 對Groovy模板引擎的支持 |
spring-boot-starter-hateoas | 對基於HATEOAS的RESTful服務的支持,通過spring-hateoas實現 |
spring-boot-starter-hornetq | 對”Java消息服務API”的支持,通過HornetQ實現 |
spring-boot-starter-integration | 對普通spring-integration模塊的支持 |
spring-boot-starter-jdbc | 對JDBC數據庫的支持 |
spring-boot-starter-jersey | 對Jersey RESTful Web服務框架的支持 |
spring-boot-starter-jta-atomikos | 對JTA分佈式事務的支持,通過Atomikos實現 |
spring-boot-starter-jta-bitronix | 對JTA分佈式事務的支持,通過Bitronix實現 |
spring-boot-starter-mail | 對javax.mail的支持 |
spring-boot-starter-mobile | 對spring-mobile的支持 |
spring-boot-starter-mustache | 對Mustache模板引擎的支持 |
spring-boot-starter-redis | 對REDIS鍵值數據存儲的支持,包括spring-redis |
spring-boot-starter-security | 對spring-security的支持 |
spring-boot-starter-social-facebook | 對spring-social-facebook的支持 |
spring-boot-starter-social-linkedin | 對spring-social-linkedin的支持 |
spring-boot-starter-social-twitter | 對spring-social-twitter的支持 |
spring-boot-starter-test | 對常用測試依賴的支持,包括JUnit, Hamcrest和Mockito,還有spring-test模塊 |
spring-boot-starter-thymeleaf | 對Thymeleaf模板引擎的支持,包括和Spring的集成 |
spring-boot-starter-velocity | 對Velocity模板引擎的支持 |
spring-boot-starter-web | 對全棧web開發的支持,包括Tomcat和spring-webmvc |
spring-boot-starter-websocket | 對WebSocket開發的支持 |
spring-boot-starter-ws | 對Spring Web服務的支持 |
相關starter pom具體資料可以查看官網:
http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-starter
2. 第三方 starter pom(不常用,不做記錄。)
三.spring Boot其他相關知識點(擴展)
https://www.jianshu.com/p/9a08417e4e84
推薦學習文獻:JavaEE開發的顛覆者 Spring Boot實戰