1. 程式人生 > 實用技巧 >springboot學習(二)基礎配置

springboot學習(二)基礎配置

Spring Boot要求main()方法所在的啟動類必須放到根package下,命名不做要求

spring-boot-starter-parent詳解

spring-boot-starter-parent是一個特殊的starter,它用來提供相關的Maven預設依賴。使用它之後,常用的包依賴可以省去version標籤,會從parent這裡繼承,spring-boot-starter-parent 的基本功能

  1. 定義了 Java 編譯版本為 1.8 。

  2. 使用 UTF-8 格式編碼。

  3. 繼承自 spring-boot-dependencies,這個裡邊定義了依賴的版本,也正是因為繼承了這個依賴,所以我們在寫依賴時才不需要寫版本號。

  4. 執行打包操作的配置。

  5. 自動化的資源過濾。

  6. 自動化的外掛配置。

  7. 針對 application.properties 和 application.yml 的資源過濾,包括通過 profile 定義的不同環境的配置檔案,例如 application-dev.properties 和 application-dev.yml。

請注意,由於application.properties和application.yml檔案接受Spring樣式佔位符 ${...} ,因此 Maven 過濾更改為使用 @..@ 佔位符,當然開發者可以通過設定名為 resource.delimiter 的Maven 屬性來覆蓋 @..@

佔位符。

配置檔案

在 Spring Boot 中,配置檔案有兩種不同的格式,一個是 properties ,另一個是 yaml 。

雖然 properties 檔案比較常見,但是相對於 properties 而言,yaml 更加簡潔明瞭,而且使用的場景也更多,除了簡潔,yaml 還有另外一個特點,就是 yaml 中的資料是有序的,properties 中的資料是無序的,在一些需要路徑匹配的配置中,順序就顯得尤為重要,此時我們一般採用 yaml。

application.properties

在 Spring Boot 中,一共有 4 個地方可以存放 application.properties 檔案。

  • 當前專案根目錄下的 config 目錄下

  • 當前專案的根目錄下

  • resources 目錄下的 config 目錄下

  • resources 目錄下

按如上順序,四個配置檔案的優先順序依次降低。如下:

這四個位置是預設位置,即 Spring Boot 啟動,預設會從這四個位置按順序去查詢相關屬性並載入。

我們也可以在專案啟動時自定義配置檔案位置,通過 spring.config.location 屬性來手動的指定配置檔案位置,指定完成後,系統就會自動去指定目錄下查詢 application.properties 檔案

如果專案已經打包成 jar ,在啟動命令中加入位置引數即可:

java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/...

普通屬性注入

properties 檔案中的配置可以 通過 @PropertySource 來引入@PropertySource("classpath:book.properties"),通過@Value註解 @Value("${key.id}")獲取properties檔案中的配置

型別安全的屬性注入

引入 @ConfigurationProperties(prefix = "book") 註解,並且配置了屬性的字首,此時會自動將 Spring 容器中對應的資料注入到物件對應的屬性中,就不用通過 @Value 註解挨個注入了,減少工作量並且避免出錯

yaml配置

application.yaml在Spring Boot中可以寫在四個不同的位置,分別是如下位置:

  1. 專案根目錄下的config目錄中

  2. 專案根目錄下

  3. classpath下的config目錄中

  4. classpath目錄下

四個位置中的application.yaml檔案的優先順序按照上面列出的順序依次降低。即如果有同一個屬性在四個檔案中都出現了,以優先順序高的為準

可以自己定義yaml檔案位置,兩種方式:

  • 一個是使用 spring.config.location屬性,表示自己重新定義配置檔案的位置,專案啟動時就按照定義的位置去查詢配置檔案,這種定義方式會覆蓋掉預設的四個位置,

  • 另一個則是使用 spring.config.additional-location這個屬性,表示在四個位置的基礎上,再新增幾個位置,新新增的位置的優先順序大於原本的位置。

不同於properties檔案的無序,yaml配置是有序的,yaml配置目前不支援@PropertySource註解。

支援HTTPS

生成證書

藉助 Java 自帶的 JDK 管理工具 keytool 來生成一個免費的 https 證書。

進入到 %JAVVA_HOME%\bin 目錄下,執行如下命令生成一個數字證書:

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048  -keystore D:\javaboy.p12 -validity 365

命令含義如下:

  • genkey 表示要建立一個新的金鑰。

  • alias 表示 keystore 的別名。

  • keyalg 表示使用的加密演算法是 RSA ,一種非對稱加密演算法。

  • keysize 表示金鑰的長度。

  • keystore 表示生成的金鑰存放位置。

  • validity 表示金鑰的有效時間,單位為天。

引入HTTPS

將上面生成的 javaboy.p12 拷貝到 Spring Boot 專案的 resources 目錄下。然後在 application.properties 中新增如下配置:

server.ssl.key-store=classpath:javaboy.p12server.ssl.key-alias=tomcathttpsserver.ssl.key-store-password=111111

其中:

  • key-store表示金鑰檔名。

  • key-alias表示金鑰別名。

  • key-store-password就是在cmd命令執行過程中輸入的密碼。

配置完成後,就可以啟動 Spring Boot 專案了,此時如果我們直接使用 Http 協議來訪問介面會報錯,只能使用HTTPS訪問

請求轉發

考慮到 Spring Boot 不支援同時啟動 HTTP 和 HTTPS ,為了解決這個問題,我們這裡可以配置一個請求轉發,當用戶發起 HTTP 呼叫時,自動轉發到 HTTPS 上。具體配置如下:

@Configuration
public class TomcatConfig {
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(createTomcatConnector());
return factory;
}
private Connector createTomcatConnector() {
Connector connector = new Connector(
"org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8081);
connector.setSecure(false);
connector.setRedirectPort(8080);
return connector;
}
}

我們配置了 Http 的請求埠為 8081,所有來自 8081 的請求,將被自動重定向到 8080 這個 https 的埠上。

如此之後,我們再去訪問 http 請求,就會自動重定向到 https。