SPRING實戰(2)、Spring基礎之配置

在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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章