最渣的 Spring Boot 文章
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).)
starter
啟動器包含一些相應的依賴項, 以及自動配置等.
Auto-configuration
Spring Boot 支援基於Java的配置, 儘管可以將 SpringApplication 與 xml 一起使用, 但是還是建議使用 @Configuration.
可以通過 @Import 註解匯入其他配置類, 也可以通過 @ImportResource 註解載入XML配置檔案.
Spring Boot 自動配置嘗試根據您新增的jar依賴項自動配置Spring應用程式. 例如, 如果專案中引入 HSQLDB jar, 並且沒有手動配置任何資料庫連線的bean, 則Spring Boot會自動配置記憶體資料庫.
您需要將 @EnableAutoConfiguration 或 @SpringBootApplication 其中一個註解新增到您的 @Configuration 類中, 從而選擇進入自動配置.
禁用自動配置
import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.*; import org.springframework.context.annotation.*; @Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
如果該類不在classpath中, 你可以使用該註解的excludeName屬性, 並指定全限定名來達到相同效果. 最後, 你可以通過 spring.autoconfigure.exclude
屬性 exclude 多個自動配置項(一個自動配置項集合)
@ComponentScan
SpringBoot在寫啟動類的時候如果不使用 @ComponentScan
指明物件掃描範圍, 預設指掃描當前啟動類所在的包裡的物件.
@SpringBootApplication
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters={@ComponentScan.Filter(type=CUSTOM,classes=TypeExcludeFilter.class),}) public @interface SpringBootApplication
使用 @SpringBootApplication
註解相當於使用了下面三個註解.
@EnableAutoConfiguration
: 啟用 Spring Boot 的自動配置.
@ComponentScan
: 對應用程式所在的包啟用 @Component 掃描.
@Configuration
: 允許在上下文中註冊額外的bean或匯入其他配置類.
ApplicationRunner or CommandLineRunner 區別
應用服務啟動時,載入一些資料和執行一些應用的初始化動作。如:刪除臨時檔案,清除快取資訊,讀取配置檔案資訊,資料庫連線等。
1、SpringBoot提供了CommandLineRunner介面。當有該介面多個實現類時,提供了@order註解實現自定義執行順序,也可以實現Ordered介面來自定義順序。
注意:數字越小,優先順序越高,也就是@Order(1)註解的類會在@Order(2)註解的類之前執行。
import com.example.studySpringBoot.service.MyMethorClassService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(value=1) public class SpringDataInit implements CommandLineRunner { @Autowired private MyMethorClassService myMethorClassService; @Override public void run(String... strings) throws Exception { int result = myMethorClassService.add(8, 56); System.out.println("----------SpringDataInit1---------"+result); } }
2、SpringBoot提供的ApplicationRunner介面也可以滿足該業務場景。不同點:ApplicationRunner中run方法的引數為ApplicationArguments,而CommandLineRunner介面中run方法的引數為String陣列。想要更詳細地獲取命令列引數,那就使用ApplicationRunner介面
import com.example.studySpringBoot.service.MyMethorClassService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; @Component public class SpringDataInit3 implements ApplicationRunner,Ordered { @Autowired private MyMethorClassService myMethorClassService; @Override public void run(ApplicationArguments applicationArguments) throws Exception { int result = myMethorClassService.add(10, 82); System.out.println("----------SpringDataInit3---------"+result); } @Override public int getOrder() { return 3; } }
外部化配置
Spring Boot允許你外部化你的配置,這樣你就可以在不同的環境中使用相同的應用程式程式碼,你可以使用 properties
檔案、YAML檔案、環境變數和命令列引數來外部化配置,屬性值可以通過使用 @Value
註解直接注入到你的bean中,通過Spring的 Environment
抽象訪問,或者通過 @ConfigurationProperties
繫結到結構化物件。
@ConfigurationProperties("spring.datasource.username")
Spring Boot使用一種非常特殊的 PropertySource
命令, 該命令旨在允許對值進行合理的覆蓋, 屬性按以下順序考慮:
- Devtools全域性設定屬性在你的主目錄(
~/.spring-boot-devtools.properties
當devtools處於啟用狀態時。 - 測試中的
@TestPropertySource
註解 - 測試中的
@SpringBootTest#properties
註解屬性 - 命令列引數
- 來自
SPRING_APPLICATION_JSON
(嵌入在環境變數或系統屬性中的內聯JSON)的屬性 -
ServletConfig
初始化引數 -
ServletContext
初始化引數 -
java:comp/env
中的JNDI屬性 - Java系統屬性(
System.getProperties()
) - 作業系統環境變數
- 一個只有random.*屬性的
RandomValuePropertySource
- 在你的jar包之外的特殊配置檔案的應用程式屬性(
application-{profile}.properties
和YAML 變體) - 在jar中打包的特殊配置檔案的應用程式屬性(
application-{profile}.properties
和YAML 變體) - 在你的jar包之外的應用程式屬性(
application.properties
和YAML 變體) - 打包在jar中的應用程式屬性(
application.properties
和YAML 變體) -
@PropertySource
註解在你的@Configuration
類上 - 預設屬性(通過設定
SpringApplication.setDefaultProperties
指定)
訪問命令列屬性
在預設情況下, SpringApplication
會轉換任何命令列選項引數 (也就是說,引數從 --
開始, 像 --server.port=9000
) 到一個 property
, 並將它們新增到Spring Environment
中, 如前所述, 命令列屬性總是優先於其他屬性源.
如果不希望將命令列屬性新增到 Environment
中, 你可以使用 SpringApplication.setAddCommandLineProperties(false)
禁用它們.
應用程式屬性檔案
SpringApplication
在以下位置從 application.properties
檔案載入屬性並將它們新增到Spring Environment
:
/config /config
列表按優先順序排序(在列表中較高的位置定義的屬性覆蓋在較低位置定義的屬性).
特殊配置檔案的屬性
我們可能在不同環境下使用不同的配置, 這些配置有可能是在同一個檔案中或不同檔案中.
1.在相同檔案中
##################################### Determime which configuration be used spring: profiles: active: "dev" # Mysql connection configuration(share) datasource: platform: "mysql" driverClassName: "com.mysql.cj.jdbc.Driver" max-active: 50 max-idle: 6 min-idle: 2 initial-size: 6 --- ##################################### for dev environment spring: profiles: "dev" datasource: # mysql connection user(dev) username: "root" # mysql connection password(dev) password: "r9DjsniiG;>7" --- ##################################### for product environment spring: profiles: "product" datasource: # mysql connection user(product) username: "root" # mysql connection password(product) password: "root" --- ##################################### for test environment spring: profiles: "test" datasource: # mysql connection user(test) username: "root" # mysql connection password(test) password: "root"
這樣在配置完相同屬性的時, 還可以對不同的環境進行不同的配置.
2.多個配置檔案.
我們可以把特定環境的配置, 放入多個配置檔案中, 但是要按照 application-{profile}.properties
格式. 如下圖.
spring.profiles.active
屬性進行設定.
我們也可以把配置檔案放在 jar 外面, 使用 spring.config.location
屬性進行設定.
java -jar beetltest-0.0.1-SNAPSHOT.jar -spring.config.location=classpath:/application.properties