SpringBoot將配置文件的值加載到工具類的靜態變量中(多環境運行加載)

 

一.首先創建一個SpringBoot項目

項目結構:

創建pom文件,映入maven工程依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.csrcb</groupId>
    <artifactId>spring_static</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

</project>

二、創建配置文件

在resource目錄下,創建配置文件application.yml,創建幾個不同環境的application-dev,application-sit、application-prod.yml的配置文件,稍後做測試使用,看是否加載不同環境下的配置參數的值

application.yml很簡單就一個端口號的配置:

在application-dev.yml(開發環境的配置參數的值)、以及sit(測試)、uat(驗證)、prod(生產)環境設置一些值

不同環境下的測試的配置參數的值不一致,爲了測試參數名設置相同下,是否取得對應運行環境的值

三.創建實體類

1.創建加載配置文件的配置類

/**
 * @Classname TestConfig
 * @Description 加載配置文件的配置類
 * @Date 2020/6/16 16:28
 * @Created by gangye
 */
@Configuration
@Data
public class TestConfig {
    @Value("${ftp.username}")
    private String username;

    @Value("${ftp.passwd}")
    private String passwd;

    @PostConstruct
    public void init(){
        ClientUtil.setConfigInfo(this);
    }
}

2.創建工具類,工具類獲得配置類的參數值

/**
 * @Classname ClientUtil
 * @Description 工具類,將配置文件的數據通過config引入到靜態變量中
 * @Date 2020/6/16 16:29
 * @Created by gangye
 */
@Slf4j
public class ClientUtil {

    private static String USERNAME;
    private static String PASSWD;

    public static void setConfigInfo(TestConfig testConfig) {
        ClientUtil.USERNAME = testConfig.getUsername();
        ClientUtil.PASSWD = testConfig.getPasswd();
    }

    public static String getValue(){
        log.info("獲得配置文件的username的值:{}",USERNAME);
        return USERNAME;
    }
}

3.創建路由,模擬調用

/**
 * @Classname controller
 * @Date 2020/6/16 16:35
 * @Created by gangye
 */
@RestController
@RequestMapping(value = "/test")
public class TestController {

    @GetMapping("/getvalue")
    public String getValue(){
        return ClientUtil.getValue();
    }
}

4.創建啓動類,在啓動類中添加Bean,爲了防止啓動時配置類的@Value註解找不到配置文件中的值,一個配置文件找不到繼續找

/**
 * @Classname AppStart
 * @Description 啓動類
 * @Date 2020/6/16 16:26
 * @Created by gangye
 */
@SpringBootApplication
public class AppStart {
    public static void main(String[] args) {
        SpringApplication.run(AppStart.class,args);
    }
}

 啓動時添加對應的運行環境設置

-Dspring.profiles.active=sit

 若springboot版本低可能會出現java.lang.IllegalArgumentException: Could not resolve placeholder ‘username’ in value “${ftp.username}”這樣的報錯

解決辦法:在啓動類中添加下面的代碼

    /**
     * Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘name’ in value “${name}”
     * @Description 爲了防止啓動時配置類的@Value註解找不到配置文件中的值,一個配置文件找不到繼續找
     * @Date 2020年6月17日14:40:08
     * @return
     */
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
        PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
        c.setIgnoreUnresolvablePlaceholders(true);
        return c;
    }

再次啓動環境(sit下)

在瀏覽器中輸入:http://localhost:8000/test/getvalue

再指定prod環境下的運行

 使用瀏覽器請求路由

關鍵使用了@Value註解以及@PostConstruct註解

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