在Spring的XML方式和基於Java的配置中,這兩種類型的配置通常會在同一個地方顯示聲明。在基於Java的配置中,帶有@Bean註解的方法一會同事初始化話bean並立即爲它的屬性設置值。Spring的環境抽象是各種配置屬性的一站式服務。它抽取了原始的屬性,這樣需要這些屬性的bean就可以從Spring本身中獲取了。Spring環境會拉取多個屬性源,包括: JVM系統屬性; 操作系統環境變量; 命令行參數; 應用屬性配置文件。Spring Boot自動配置的bean都可以通過Spring環境提取的屬性進行配置。
Spring的兩種裝配方式:
bean裝配:聲明在Spring應用上下文中創建哪些應用組件以及它們之間如何互相注入的配置。
屬性注入:設置Spring應用上下文中bean的值的配置。
外部配置屬性如指定端口號,那麼可以在使用命令行參數啓動應用的時候指定端口: $ java -jar tacocloud-0.0.5-SNAPSHOT.jar --server.port=9090。如果你希望應用始終在一個特定的端口啓動,那麼可以通過操作系統的環境變量進行一次性的設置: $ export SERVER_PORT=9090。
在配置數據源時,儘管我們需要將對應 的JDBC驅動添加到構建文件中,但是我們不需要指定JDBC驅動類。Spring Boot會根據數據庫URL的結構推算出來。然而,如果這樣做有問題的話,我們依然可以通過spring.datasource.driver-class-name屬性來進行設置。如果在類路徑中存在Tomcat的JDBC連接池,DataSource將使用該連接池。否則,Spring Boot將會在類路徑下嘗試查找並使用如下的連接池實現:· HikariCP ·Commons DBCP2。
spring.datasource.schema和spring.datasource.data屬性,可以聲明應用啓動的時候要執行的數據庫初始化腳本。如果無法使用顯式配置數據源的方式,而是更加傾向於在JNDI(Java Naming and Directory Interface,Java命名和目錄接口)中配置數據源並讓Spring去那裏進行查找,可以使用spring.datasource.jndi-name搭建自己的數據源。如果設置了spring.datasource.jndi-name屬性,其他的數據庫連接屬性(已經設置了的話)就會被忽略。
配置嵌入式數據庫
server.port屬性顯式設置成了0,但是服務器並不會真的在端口0上啓動。相反,它會任選一個可用的端口。
對底層容器常見的一項設置就是讓它處理HTTPS請求。爲了實現這一點,我們首先要使用JDK的keytool命令行工具生成keystore: $ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA。接下來,我們需要設置一些屬性,以便於在嵌入式服務器中啓用HTTPS。我們可以在命令行中進行配置,但是這種方式非常不方便,相反,你可能更願意通過application.properties或application.yml文件來聲明配置。在application.yml中,配置屬性如下:
server:
port: 8443
ssl:
key-store: file:///path/to/mykeys.jks
key-store-password: aaa
key-password: aaa
- server.port設置爲8443,這是在開發階段HTTPS服務器的常用選擇。
- server.ssl.key-store屬性應該設置爲我們所創建的keystore文件的路徑。在這裏,它使用了file:// URL,因此會在文件系統中加載,但是,如果你需要將它打包到一個應用JAR文件中,就需要使用“classpath:”URL來引用它。
- server.ssl.key-store-password和server.ssl.key-password屬性都設置成了創建keystore時所設置的密碼。
日誌配置
默認情況下,Spring Boot通過Logback配置日誌,日誌會以INFO級別寫入到控制檯中。爲了完全控制日誌的配置,我們可以在類路徑的根目錄下(在src/main/resources中)創建一個logback.xml文件。
如下是一個logback.xml配置的樣例,更多的使用方法可以參見:http://logback.qos.ch/manual/configuration.html#autoScan
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender><root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
藉助Spring Boot的配置屬性功能,我們不用創建logback.xml文件就能完成這些變更。默認情況下,日誌文件一旦達到10MB,就會輪換。
logging:
path: /var/logs/
file: LOG.log
level:
tacos: WARN
org:
springframework:
security: DEBUG
在設置屬性的時候,我們並非必須要將它們的值設置爲硬編碼的String或數值。其實,我們還可以從其他的配置屬性派生值。 例如,假設(不管基於什麼原因)我們想要設置一個名爲greeting.welcome的屬性,它的值來源於名爲spring.application.name的另一個屬性。爲了實現該功能,在設置greeting.welcome的時候,我們可以使用${}佔位符標記。
greeting: welcome: ${spring.application.name}
爲了支持配置屬性的注入,Spring Boot提供了@ConfigurationProperties註解。將它放到Spring bean上之後,它就會爲該bean中那些能夠根據Spring環境注入值的屬性賦值。@ConfigurationProperties通常會放到一種特定類型的bean中,這種bean的目的就是持有配置數據。
配置屬性的元數據完全是可選的,它並不會妨礙配置屬性的運行。但是,元數據對於爲配置屬性提供一個最小化的文檔非常有用。爲了創建自定義配置屬性的元數據,我們需要在META-INF下創建一個名爲additional-spring-configuration-metadata.json的文件。
Spring profile。profile是一種條件化的配置,在運行時,根據哪些profile處於激活狀態,可以使用或忽略不同的bean、配置類和配置屬性。定義特定profile相關的屬性的一種方式就是創建另外一個YAML或屬性文件,其中只包含用於生產環境的屬性。文件的名稱要遵守如下的約定:application-{profile名}.yml或 application-{profile名}.properties。通過創建模式爲application-{profile名}.yml或application-{profile名}.properties的YAML或屬性文件,我們可以按需定義任意數量的profile。或者,我們也可以在application.yml中再輸入3箇中劃線,結合spring.profiles屬性來指定其他名稱的profile,然後添加該profile特定的相關屬性。
如何激活一個profile呢?
要激活某個profile,需要做的就是將profile名稱的列表賦值給spring.profiles.active屬性。例如,在application.yml中,我們可以如下方式設置,spring.profiles.active屬性名是複數形式的profile。這意味着我們可以設置多個激活的profile。
spring:
profiles:
active: -prod
如果我們將Spring應用部署到Cloud Foundry中,將會自動激活一個名爲cloud的profile。如果你的生產環境是Cloud Foundry,那麼你可以將生產環境相關的屬性放到cloud profile下。有時候,爲不同的profile創建一組獨特的bean是非常有用的。正常情況下,不管哪個profile處於激活狀態,Java配置類中聲明的所有bean都會被創建。但是,假設我們希望某些bean僅在特定profile激活的情況下才需要創建。在這種情況下,@Profile註解可以將某些bean設置爲僅適用於給定的profile。