1.背景:之前假如想建立一個Spring應用, 好比Spring、SpringMVC、Mybatis三大框架的整合, 咱們須要一堆繁瑣的步驟:maven導一堆依賴-->寫一堆配置文件-->測試-->打成war包部署到Servlet容器上,能夠說是至關繁瑣。SpringBoot就是來簡化這些步驟的。css
2.SpringBoot的做用:幫助咱們很快的建立一個產品級別的Spring應用,簡化J2EE開發。SpringBoot會自動幫咱們配置好Springjava
的相關配置,所以用戶能夠無需去清楚Spring的配置,就能夠從SpringBoot這個微小的入口打開J2EE的大門。spring
3.概括一下SpringBoot的優勢:數組
(1)快速建立獨立運行的Spring項目以及與主流框架集成tomcat
(2)使用嵌入式的Servlet容器,應用無需打成WAR包跑在servlet容器上。打成Jar包,而後java -jar便可運行服務器
(3)starters自動依賴與版本控制app
(4)大量的自動配置,簡化開發,也能夠修改默認值框架
(5)無需配置XML,無代碼生成,開箱即用運維
(6)準生產環境的運行時應用監控dom
(7)與雲計算的自然集成
4,SpringBoot的缺點:入門容易,精通難。之因此那麼說,是由於SpringBoot是基於Spring的一個再封裝,若是你對Spring框架一無所知,那就作不到精通。
5.HelloWord(基於maven建立)
(1)建立一個maven工程。
(2)導入SpringBoot的依賴
(3)建一個類,在類上標註@SpringBootApplication,來告訴SpringBoot這是一個主程序類,說明這是一個SpringBoot應用
(4)再主程序類裏添加main方法(idea快捷鍵:psvm),而後在main方法裏添加SpringApplication.run(主程序類.class,args);
(5)編寫相關的Controller、Service等。
(6)運行測試:主程序裏直接運行main方法便可開啓應用。tomcat8080端口(內置了tomcat)。
(7)部署:導入SpingBoot的Maven插件
這個插件的做用就是將應用打包成可執行的jar包。
(8)運行:java -jar命令便可啓動。即便目標服務器裏沒有裝tomcat也沒問題。
5.Spring-Boot-starter(SpringBoot場景啓動器):每一個功能場景都有本身的starter,每一個starter裏面都導入了本身須要的依賴,要用什麼功能就導入什麼場景啓動器
6.須要將全部組件都放到主配置類(@SpringBootApplication標註的類)所在包及下面全部子包裏面,否則不會被掃描到Spring容器裏。全部自動配置的信息(好比SpringMVC等)都配置在@SpringBootApplication註解裏。
7.使用Spring Initializer快速建立SpringBoot應用:
(1)
(2)
(3)選擇模塊
建立完成以後主程序會自動生成好, 咱們只須要寫咱們本身的邏輯。
resources文件目錄結構:static:保存全部的靜態資源(js、css、images)
templates:保存全部的模板頁面,SpringBoot默認jar包嵌入式的Tomcat,默認不知處jsp頁面)
可使用模板引擎代替。
application.properties:SpringBoot的配置文件。能夠在這裏修改默認配置。e.g 默認tomcat不想用
8080端口了,能夠在裏面寫上sever.port=8081
8.SpringBoot的配置
有兩種全局配置文件,分別是application.properties和application.yml 文件名固定不可變.
配置文件的做用: 修改SpringBoot的自動配置默認值.
yml和xml的對比:
yml:
xml:
很明顯, yml文檔要比xml文檔來的更加簡潔.
8.1yml基本語法
普通的值 K:(空格)V 注意:這裏的空格必須有. 只要是左對齊的一列數據, 都是同一層級的. 屬性和值是大小寫敏感的.
字符串默認不用加單引號或者雙引號 ""雙引號不會轉義裏面的特殊字符, 特殊字符會做爲自己想表示的意思 例: "zhangsan /n lisi", 輸出: zhangsan 換行 lisi
''單引號會轉義特殊字符,特殊字符只是一個普通的字符串輸出.例: "zhangsan /n lisi", 輸出: zhangsan /n lisi
對象 friends:
lastName: zhangsan
age: 20
對象(行內寫法) friends: {lastName: zhangsan,age: 20}
數組 用-(空格)表示數組中的一個元素 例:pets:
- cat
-dog
數組(行內寫法) pets: [cat,dog]
8.2 如何在yml裏面配置屬性, 而後注入到bean中.
public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> list; private Dog dog;
定義一個Person類.
yml配置.
接下來要怎樣把yml文件裏面的配置信息映射到這個bean中呢?
用@ConfigurationProperties(prefix = "person") 註解, 這個註解的意義是告訴SpringBoot將本類中的全部屬性和配置文件中的相關屬性進行綁定
@ConfigurationProperties(prefix = "person") public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> list; private Dog dog;
此時IDEA會報一個提示, 沒有在類路徑下找到SpringBoot的配置註釋處理器
只須要點擊Open Documentation, 到達SpringBoot官網, 把依賴添加過來便可. 加入這個插件之後還有個好處就是在yml或者properties裏配置信息的時候會有提示
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
注意:這個bean必需要是Spring容器中的組件, 也就是必須加上@Component註解. 此時已經設置完畢, 能夠開始進行測試.
到測試包下能夠看到一個Test類, 這是SpringBoot的單元測試
注入Person,而後在控制檯輸出一下便可看到效果. 由此能夠得出, 把一些初始化配置配置在yml裏面, 修改至關方便.
固然, 咱們的配置信息也能夠放在application,properties當中, 語法與yml文件略有不一樣.
person.last-name=張三 person.age=50 person.birth=1992/06/19 person.boss=true person.dog.name=555 person.dog.age=5 person.maps.k1=v1 person.maps..k2=v2 person.list=1,2,3
插入以後執行測試, 發現有中文亂碼狀況. 緣由: idea默認是utf-8, 而application.properties默認的不是utf-8.所以咱們輸入的"張三"並非utf-8格式
解決方法:file->setting->搜索FileEncoding
這樣在輸入時就是utf-8格式, 而後幫咱們自動轉化爲ascii格式讓程序進行獲取.
那麼問題來了, application.properties和application.yml均可以進行配置, 那麼誰的優先級更高呢? 博主測試了一下, 是application,properties更高! yml與properties相比較, 看上去更清晰, 更有層次感些.
用@ConfigurationProperties在注入時, 也能夠進行數據驗證, 在@ConfigurationProperties下面加上@Validated, 表示注入須要驗證.接下來就能夠在各個屬性上添加不同的格式(好比@Email)
1 @Component 2 @ConfigurationProperties(prefix = "person") 3 @Validated 4 public class Person { 5 @Email 6 private String lastName;//此時在配置文件中lastName若不是email格式,則會報錯
從配置文件中注入屬性值有兩種方法, 一種是在類上添加@ConfigulationProperties(支持數據校驗), 一種是在屬性上添加@Value(不支持數據校驗)
什麼時候用何種狀況:若是說咱們只是在某個業務邏輯中須要獲取一下配置文件中的某項值, 使用@Value
若是說咱們專門編寫了一個JavaBean來和配置文件進行映射, 咱們就直接使用@ConfigulationProperties
那麼咱們全部配置Javabean的信息都配到application.yml(全局配置文件)或者application.properties(全局配置文件)真的好嗎?固然很差, 這樣配置文件也太大了. 咱們通常把和SpringBoot無關的配置信息單獨放到別的配置文件中去, 而後經過@PropertySource(value="classpath:***")來注入.
1 @Component 2 @PropertySource(value = "classpath:person.properties")//person.properties放在resources文件夾下 3 @ConfigurationProperties(prefix = "person")//這個註解不能刪除, 否則沒法注入, 默認爲從全局配置文件中獲取配置信息, 加了@PropertiesSource以後就從這個指定的配置文件中獲取配置信息 4 public class Person { 5 private String lastName; 6 private Integer age; 7 private Boolean boss; 8 private Date birth; 9 10 private Map<String,Object> maps; 11 private List<Object> list; 12 private Dog dog;
在配置文件裏咱們還可使用佔位符${屬性名},佔位符裏也能夠添加SpringBoot提供的一些功能, 好比隨機數/uuid等
1 dog: 2 name: 歡歡${person.birth} 3 age: 1 4 last-name: 一頭生猛的程序猿${random.uuid}
9.Profile
爲了方便咱們的多環境配置, 好比測試環境/生產環境, 他們的配置信息確定是不一樣的, 如何快速的切換, 就要用到咱們的Profile
多profile文件模式: 咱們在主配置文件編寫的時候, 文件名能夠是:application-{profile}.Properties/yml
例: 如今有Application.properties 設置端口8080
Application-{test}.properties 設置端口8081
Application-{product}.properties 設置端口8082
測試跑起來以後, 開啓的端口爲8080, 採用了默認設置
此時, 在Application.properties中添加一行 spring.profiles.active=test //激活test
執行測試發現開啓的端口是8081. 由此得出, 咱們能夠在默認全局配置文件Application.Properties中進行靈活的切換, 缺點就是須要新建不少個profile文件(用yml支持多文檔塊方式便可彌補這個缺點)
yml支持多文檔塊方式:以yml做爲主配置文件, yml內部能夠分爲多個文檔塊, 經過"---"進行劃分,這樣就避免了多個profile文件的建立
10.配置文件的加載位置:
SpringBoot啓動會掃描如下位置的application.yml或application,properties做爲Spring boot默認配置文件
file:./config/
file:./
classpath:/config/
classpath:/
優先級從上到下是從高到低, 相同的屬性配置, 低優先級的會被高優先級的覆蓋 ; 一些低優先級包含,高優先級不包含的則以低優先級的爲準. 也就是互補配置! 默認打包只會打包類路徑下的, 工程路徑下的不打包.
咱們還能夠經過spring.config.location來改變默認的配置文件位置(應用場景: 在運維過程當中,當項目已經打包, 可是想修改一些配置的時候),注意:這裏也是互補配置