上一節我們玩了SB的properties配置文件和yml配置文件,這篇我們繼續玩,玩一玩一些實用好玩的
1.獲取配置文件裏的值
就繼續上一節的配置文件,我們配置了端口和上下文根,在SpringBoot中,可以使用Value註解進行獲取。這一次我們也在配置文件裏面隨便添加一個自定義的配置,用於演示獲取。(Value註解也不是SpringBoot專屬的,Spring本身就有在用)
YAML配置文件如下(hehe不是系統的配置項,所以有警告)
程序代碼如下
package com.kazz;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Value("${server.context-path}")
private String context_path;
@Value("${server.port}")
private int port; //整形也是沒有問題的
@Value("${hehe.blog}")
private String blog;
@Value("${hehe.author}")
private String author;
@RequestMapping("/config")
public String config() {
StringBuilder sb = new StringBuilder("玩一玩配置文件的取值,端口:");
sb.append(port).append(",上下文根:").append(context_path);
return sb.toString();
}
@RequestMapping("/config2")
public String config2() {
StringBuilder sb = new StringBuilder("玩一玩配置文件的取值,博客類型:");
sb.append(blog).append(",作者:").append(author);
return sb.toString();
}
}
2.封裝配置項
實際項目開發過程中,一般不會使用這種@Value直接引用配置項,而是將其封裝起來,已get方法的形式給外部調用,當然我們自己在封裝配置項類時,對成員使用@Value也是可以的,不過SpringBoot給我們提供了一種更方便快捷的封裝形式:@ConfigurationProperties,我們新建一個類演示一下
package com.kazz;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "hehe") // 指定配置項的前綴
public class Configs {
private String blog;
private String author;
public String getBlog() {
return blog;
}
public String getAuthor() {
return author;
}
//不能省略set方法
public void setBlog(String blog) {
this.blog = blog;
}
public void setAuthor(String author) {
this.author = author;
}
}
使用@ConfigurationProperties註解時,開發工具提示我,要在pom文件裏面加入一下依賴,不然會有警告
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
搞定後,在我們的主函數裏面添加對這個配置項類的注入與使用的代碼
@Autowired
private Configs configs;
@RequestMapping("/config3")
public String config3() {
StringBuilder sb = new StringBuilder("玩一玩配置項的封裝,博客類型:");
sb.append(configs.getBlog()).append(",作者:").append(configs.getAuthor());
return sb.toString();
}
啓動程序,瀏覽器訪問http://127.0.0.1/sb/config3,結果如下截圖
3.profile配置
實際開發過程中,我們經常遇到這樣的問題:本地開發環境,和測試環境、生產環境的配置不同。各個環境,要麼ip不同、要麼端口不同、要麼業務參數不同,導致的相同的程序,相同的配置文件名有着不太能同的配置信息。有時候新增配置項,由於編寫投產手冊的疏忽,導致配置出錯而出現生成故障,這是很不應該的。
爲了解決這個問題,Spring提出來profile的支持,即程序能同時配置多個子配置文件,通過修改主配置文件的指向來使用這些子配置文件的其中一個。下面我在我的項目中的src/resources/下,新建application-kaifa.yml和application-shengchan.yml兩個配置文件,用來區分開發環境和生產環境。
生產環境的配置文件
開發環境的配置文件
主配置文件
現在的主配置文件,指明使用的配置文件是開發環境的,即使用application-kaifa.yml,此時我們的程序沒有做任何的修改,我們啓動程序,再次訪問上面的config3,不過端口改了,http://127.0.0.1:6666/sb/config3,結果如下
說明程序已經成功加載到了開發環境的配置文件,現在我們再把主配置文件改爲指向生產環境,再次訪問config3,結果如下所示
能看出程序已經切換爲生產環境的配置文件了。其實也並不是一定要主配置文件只有spring:profile:active項,然後其他的全都寫在各個子配置文件中,當子配置文件的配置項相同,建議還是把這些相同的配置項寫在主配置文件裏面,不然以後改配置項也很容易改漏。
另外,當主配置文件和子配置文件存在相同配置時,程序還是會已子配置文件的爲準,不信的話,就自動動手試試看吧!