1. 程式人生 > >微服務架構學習Day01-SpringBoot入門

微服務架構學習Day01-SpringBoot入門

# 基本概念 - **SpringBoot的優點:** - 可以建立獨立的**Spring**應用 - **SpringBoot**嵌入**Tomcat,Jetty**和**Unsertow,** 不需要部署**war**檔案 - 根據需要通過**maven**獲取**starter** - 對**Spring**進行自動配置 - 提供生產就緒型功能,包括指標,健康檢查和外部配置 # SpringBoot父專案 ```xml ``` - 管理SpringBoot應用裡面所有的依賴版本,這樣以後匯入依賴預設不需要寫版本號,可以統一管理開發版本(沒有在dependencies裡面管理的依賴才需要宣告版本號) ## spring-boot-starter ```xml ``` - **spring-boot-starter:** springboot場景啟動器 - **spring-boot-starter-web:** 匯入web模組正常執行所依賴的元件 - SpringBoot將所有的功能場景都抽取出來,做成各個starter啟動器,只需要在專案的pom.xml中引入這些starter依賴,相關場景的所有依賴都會被匯入進來。 ## @SpringBootApplication - **@SpringBootApplication**:標註在SpringBoot的主配置類,SpringBoot就會執行這個類的main方法來啟動SpringBoot運用。 ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration //SpringBoot配置類,類似於配置檔案。配置類也是容器中的元件。標註在類上標明是一個SpringBoot配置類 @EnableAutoConfiguration //開啟SpringBoot自動配置功能 @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { @AliasFor( annotation = EnableAutoConfiguration.class, attribute = "exclude" ) Class[] exclude() default {}; @AliasFor( annotation = EnableAutoConfiguration.class, attribute = "excludeName" ) String[] excludeName() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackages" ) String[] scanBasePackages() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackageClasses" ) Class[] scanBasePackageClasses() default {}; } ``` - **@SpringBootConfiguration:** SpringBoot配置類,類似於配置檔案。配置類也是容器中的元件。標註在類上標明是一個SpringBoot配置類 ```java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration // 表明該類是一個Spring的配置類 public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; } ``` ```java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component // 表明該類是Spring的一個元件 public @interface Configuration { @AliasFor( annotation = Component.class ) String value default ""; boolean proxyBeanMethods() default true; } ``` - **@EnableAutoConfiguration:** 開啟SpringBoot自動配置功能 ```java package org.springframework.boot.autoconfigure; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.context.annotation.Import; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class[] exclude() default {}; String[] excludeName() default {}; } ``` - **@AutoConfigurationPackage:** 自動配置包,通過 **@Import({Registrar.class})** 完成,通過檢視**Registrar**原始碼發現將主配置類即 **@SpringBootApplication**標註的類的所在包及所有子包裡面的所有元件掃描到**Spring**容器中 - 其中,**@Import**是Spring的底層註解,給容器匯入一個元件,匯入的元件由**Registrar.class**來指定。 - **AutoConfigurationImportSelector**:匯入元件的選擇器,將所有需要匯入的元件以全類名的方式返回,這樣元件就會被新增到容器中 - 會給容器中匯入自動配置類:就是給容器中匯入場景所有的元件並配置好.這樣就不用手動編寫配置並注入功能元件 - **SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader)**: - 從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值 - **過程總結:** - SpringBoot在啟動的時候從類路徑下的**META-INF/spring.factories**中獲取**EnableAutoConfiguration**指定的值 - 將這些值作為自動配置類匯入到容器中,自動配置類就會生效,進行配置工作。 - **J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-2.0.1.RELEASE.jar中** --- 在SpringBoot專案中的**resources**資料夾: - **static**:儲存所有靜態資源,例如 js,css,images - **templates**:儲存所有的模板頁面。在SpringBoot中預設jar包使用的是嵌入式tomcat,預設不支援jsp頁面。可以使用模板引擎:freemarker,thymeleaf - **application.properties**:SpringBoot應用的配置檔案,可以修改一些預設設定 # SpringBoot配置 ### 配置檔案 SpringBoot使用一個全域性配置檔案,配置檔名是固定的: - **application.properties** - **application.yml** - 配置檔案作用:修改SpringBoot自動配置的預設值。 ### yml - **yml**:(YAML Ain't Markup Language)以資料為中心,比json、xml等更適合做配置檔案。 ##### YAML基本語法 - **key: value**(表示一對鍵值對。value前面必須要有空格。) - 以**空格縮排**來表示層級關係,只要是左對齊的一列資料,都是同一個層級的 1.縮排時不允許使用Tab鍵,只允許使用空格 2.縮排的空格數目不重要,只要相同層級的元素左側對齊即可 - 屬性和值是**大小寫敏感** - **值的寫法:** - 字面量:普通的值(數字,字串,布林值) - **key:value** :字面量直接書寫。字串預設不加引號。 - 單引號-轉義字元會作為普通字串輸出 - 雙引號-轉義字元會轉變成格式 - 物件、Map(屬性和值,鍵值對): - 物件還是key: value的方式 ```yml friends: lastName: Chova firstName: Vea ``` 行內寫法: ```yml friends: {lastName: Chova,firstName: Vea} ``` - 陣列(List、Set) - 用 **- 值**表示陣列中的元素 ```yml pets: - dog - cat - pig ``` 行內寫法: ```yml pets: [dog,cat,pig] ``` ## @Value獲取值和@ConfigurationProperties獲取值比較 ||@Value|@ConfigurationProperties| |--|--|--| |功能|在屬性上一個一個指定注入|批量注入配置檔案中的屬性| |鬆散繫結(鬆散語法)|不支援|支援 | |SpEL|支援|不支援 | |JSR303資料校驗|不支援|支援 | |複雜型別封裝|不支援|支援 | - **如果我們只是在某個業務邏輯中需要獲取一下配置檔案的某項值,就使用@Value** - **如果JavaBean需要和配置檔案進行對映,就使用@ConfigurationProperties** ## 配置檔案注入值數值校驗(JSR303) - 必須要用 **@ConfigurationProperties** - **JSR303資料校驗**:@Validate-@Email ## @PropertySource和@ImportResource - **@PropertySource**:載入指定的配置檔案 ```java @PropertySource(value = {"classpath:person.properties"}) ``` - **@ImportResource**:匯入Spring的配置檔案,讓配置檔案的內容生效 ```java @ImportResource(locations={"classpath:beans.xml"}) ``` - **SpringBoot推薦給容器中新增元件的方式:** 推薦使用 **全註解** 的方式 1.配置類 **---** Spring配置檔案 2.使用 **@Bean**在配置類中為容器中新增元件 ## 配置檔案佔位符 - **RandomValuePropertySource**:配置檔案中可以使用隨機數 ```xml 1.${random.value} 2.${random.int} 3.${random.int(10)} 4.${random.int[1024,65536]} ``` - **屬性配置佔位符**: 1.可以在配置檔案中引用前面配置過的屬性(優先順序前面配置過的這裡都能用) 2.${app.name:預設值}來指定找不到屬性值時的預設值 ## Profile - **多Profile檔案**: 1.在寫配置檔案的時候,檔名可以是:application-{profile}.properties/yml 2.預設使用application.properties的配置 - **yml支援多文件塊方式** - 用"- - -"劃分文件塊 ```xml --- ``` **啟用指定Profile**: **1.在主配置檔案application.properties中指定啟用:** ```xml spring.profiles.active=dev ``` 2.命令列啟用:(Program arguments) ```xml --spring.profiles.active=dev ``` 3.虛擬機器引數啟用:(VM options) ```xml -Dspring.profiles.active=dev ``` ## 配置檔案載入位置 - SpringBoot啟動會掃描以下位置的application.properties或者application.yml檔案作為SpringBoot的預設配置檔案 1. file:./config/ 2. file:./ 3. classpath:/config 4. classpath:/ - 以上按照**優先順序從高到低**,所有檔案都會被載入,互補配置。高優先順序內容會覆蓋低優先順序內容。 - 可以通過配置**- -spring.config.location**來改變預設配置位置:專案打包好以後,使用命令列引數的形式,啟動專案的時候來指定配置檔案的新位置,指定的配置檔案和預設載入的配置檔案會共同起作用,互補配置。 ## 外部配置的載入順序 - SpringBoot支援多種外部配置方式,優先順序如下: 1.**命令列引數**(- -,多個命令用空格分開) 2.來自java:comp/env的JNDI屬性 3.Java系統屬性(System.getProperties()) 4.作業系統環境變數 5.RandomValuePropertySource配置的random.*屬性值 **由jar包外部向jar包內進行尋找:** **優先載入帶profile的:** 6.**jar包外部的application-{profile}.properties/yml(帶spring.profile)配置檔案** 7.**jar包內部的application-{profile}.properties/yml(帶spring.profile)配置檔案** **然後載入不帶Profile的:** 8.**jar包外部的application-{profile}.properties/yml(不帶spring.profile)配置檔案** 9.**jar包內部的application-{profile}.properties/yml(不帶spring.profile)配置檔案** 10.@Configuration註解類上的@PropertySource 11.通過SpringApplication.setDefaultProperties指定的預設屬性 # 自動配置原理 - SpringBoot啟動時載入主配置類,開啟了自動配置功能 **@EnableAutoConfiguration** - **@EnableAutoConfiguration**作用:利用**EnableAutoConfigurationImportSelector**給容器匯入元件。 具體實現可以檢視**selectImports()** 方法: ```j