Springboot快速上手- 第四篇 自定義配置

mug發表於2021-09-09

1:概述

Spring Boot支援根據應用的實際需要,進行自定義配置, Spring Boot能從多種屬性源獲得屬性,包括如下幾處:
圖片描述

2:可調整的屬性

對於Spring Boot自動配置的Bean,目前提供了上千個用於微調的屬性。
具體的可以參看官方文件:

3: 自定義屬性

Spring Boot允許使用properties檔案、yml檔案或者命令列引數作為外部配置,並提供自定義屬性的支援。比如我們可以在application.properties配置一些常量,例如:

cc.add.k1=k1vv
cc.add.k2=k222

然後直接在要使用的地方透過註解@Value(value=”${config.name}”)就可以繫結到你想要的屬性上面

  • 1:使用@Value註解,可以直接將屬性值注入到你的beans中,也可以透過Spring的Environment抽象或繫結到結構化物件來訪問。

  • 2:如果屬性太多了,一個個繫結到屬性欄位上太累,官方提倡繫結一個物件的bean,比如:這裡我們建一個ConfigBean.java類,頂部需要使用註解@ConfigurationProperties(prefix = “cc.add”)來指明使用哪個,示例如下:

@ConfigurationProperties(prefix="cc.add")
public class SysConf {
   private String k1;
   private String k2;
  // 省略getter和setter
}
  • 3:然後在啟動類上新增:
 @EnableConfigurationProperties({SysConf.class})
  • 4:然後就可以在要使用的類裡面直接注入了:
@Autowired
private SysConf sc;

5:也可以使用

 @Autowired
 private Environment env;

然後用env.getProperty(“cc.add.k1”)去訪問

4: 引數間引用

在application.properties中的各個引數之間也可以直接引用來使用,使用${paramID},如:

 cc.add.k1=k1vv
 cc.add.k2=k222-${cc.add.k1}

5: 使用自定義配置檔案

有時候我們不希望把所有配置都放在application.properties裡面,這時候我們可以另外定義一個,比如:my.properties,形如:

cc.add.k3=k3vv
cc.add.k4=k444-${cc.add.k1}

1:然後再寫一個配置bean,形如:

@Configuration
@ConfigurationProperties(prefix = "cc.add") 
@PropertySource("classpath:my.properties")
public class MyConf {
   private String k3;
   private String k4;
}

由於配置了@Configuration,因此不用在啟動類中新增了

2:使用方法跟前面使用屬性配置類SysConf是一樣的

6: 配置隨機值

可以使用${random} 可以用來生成各種不同型別的隨機值,例如:

${random.value}
${random.int}
${random.long}
${random.uuid}
${random.int(5)}
${random.int[5,10]}

7: 配置檔案的放置位置

自定義的配置檔案,有多個可以放置的位置:

(1)外接,在相對於應用程式執行目錄的/config子目錄裡
(2)外接,在應用程式執行的目錄裡
(3)內建,在config包內
(4)內建,在Classpath根目錄

1:這個列表按照優先順序排序。也就是說,/config子目錄裡的application.properties會覆蓋應用程式Classpath裡的application.properties中的相同屬性。

2:此外,如果你在同一優先順序位置同時有application.properties和application.yml,那麼application.properties裡的屬性會覆蓋application.yml裡的屬性(有資料說的相反)

微調自動配置示例
簡單的給出幾個微調自動配置的例子,以學習微調的方法。
1:配置嵌入式伺服器埠,形如:server.port=9080
配置上下文路徑,形如:server.context-path=/myweb

8: 配置日誌

預設情況下,Spring Boot會用Logback來記錄日誌,並用INFO級別輸出到控制檯。一般來說,你不需要切換日誌實現;Logback能很好地滿足你的需要。

1:如果決定使用Log4j或者Log4j2,那麼你只需要修改依賴,引入對應該日誌實現的起步依賴,同時排除掉 Logback。
以Maven為例,應排除掉根起步依賴傳遞引入的預設日誌起步依賴,這樣就能排除 Logback了,形如:

 <dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

2:通常對日誌配置最常做的改動就是修改日誌級別和指定日誌輸出的檔案。使用了 Spring Boot的配置屬性後,可以在不建立logback.xml檔案的情況下修改那些配置。

在application.properties裡設定:

 logging.path=/var/logs/
 logging.file=my.log
 logging.level.root=WARN
 logging.level.root.org.springframework.security=DEBUG

3:假設應用程式有/var/logs/的寫許可權,日誌就能被寫入/var/logs/my.log。預設情況下,日誌檔案的大小達到10MB時會切分一次。

4:要完全掌握日誌配置,可以在Classpath的根目錄(src/main/resources)裡建立logback.xml文 件。下面是一個logback.xml的簡單例子:

<configuration>
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			  <pattern>
			%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
		</pattern>
		</encoder>
	</appender>
	<logger name="root" level="INFO"/>
	<root level="INFO">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

5:由於日誌是在ApplicationContext被建立之前初始化,所以不可能在Spring的@Configuration檔案中,透過系統屬性和傳統的外部配置檔案來進行調整。

9: 使用profile

1:遵循application-{profile}. properties/yml這種命名格式,這樣就能提供特定於Profile的屬性了。形如:

 application-dev.properties
 application-test.properties

2:在application.properties中使用spring.profiles.active屬性來設定具體要使用哪一個profile

(1)可以啟動多個profile,如:

 spring.profiles.active=test,testConf

(2)還可以用spring.profiles.include來疊加profile

 spring.profiles.include=test,testConf

3:可以用profile的配置檔案來分割槽配置我們的環境變數,在類裡,還可以直接用@Profile註解來進行配置

(1)定義配置用的介面,如:

public interface MyProfile {
   String getDBConf();
}

(2)實現配置介面,如:

@Component
@Profile("devConf")
public class Dev implements MyProfile {
   public String getDBConf() {
     return "devDB";
   }
}

@Component
@Profile("testConf")
public class ForTest implements MyProfile{
   public String getDBConf() {
     return "testDB";
   }
}

(3)在properties配置檔案中配置:

 spring.profiles.include=test,devConf

(4)在需要獲取配置的類裡面就可以直接注入來使用了,如:

 @Autowiredprivate
 MyProfile mp;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2825714/,如需轉載,請註明出處,否則將追究法律責任。

相關文章