
一、前言
我們在開發(fā)中會經(jīng)常遇到一些可能會變的值,比如數(shù)據(jù)庫的密碼,一些關(guān)鍵鏈接的配置等等。
都需要我們寫在配置文件中,這樣可以把這些配置文件放到nacos上進(jìn)行管理,修改nacos的配置,咱們發(fā)布的包就可以動態(tài)的進(jìn)行更新了,不需要重新修改打包在重新發(fā)包!
咱們今天就來說一說讀取配置文件中的值常見的兩種方法,剛剛說的動態(tài)更新配置的是第二種配置哈!@Value("${school.teacher}")不會動態(tài)更新,所以小編推薦使用第二種方式@ConfigurationProperties(prefix = "school")進(jìn)行讀取配置文件!下面小編 也會帶大家一起演示一下不需要重啟項(xiàng)目就可以動態(tài)的更新,在生產(chǎn)上非常的好用!
二、第一種方式
第一種方式比較場景,也是最簡單的,就是@Value($(配置文件中的參數(shù)))。
我們首先在application.yml文件中寫一個配置:
school:
 teacher: 王老師
 student: 小明
?這里key的冒號后面一定要有個空格,字符串不需要加雙引號!
我們?yōu)榱朔奖阒苯釉赾ontroller進(jìn)行演示了??!
@RestController
@RequestMapping("/test")
@Slf4j
@RequiredArgsConstructor
public class TestController {
    @Value("${school.teacher}")
    private String teacher;
    @Value("${school.student}")
    private String student;
    @GetMapping("/testValue")
    public Result testValue(){
        return Result.success(teacher + "--->" + student);
    }
}
我們debug看一下是否可以讀取到配置中的值!

我們可以看到是有值的!
三、第二種方式(推薦)
這種方式是小編比較推薦的,雖然看似比@Value麻煩不少,但是更加的規(guī)范,在配合nacos的時候也可以動態(tài)的修改,會立即生效,一會小編帶大家試一下哈?。槭裁赐扑]這種方式呢,是因?yàn)閟pring他們都是使用這種方式進(jìn)行配置的,所以跟著官方走不會有錯的!
1、修改yml文件
我們剛剛修改了一下yml配置文件,讓類型更加豐富!
school:
 teacher: 王老師
 studentList:
   - 小明
   - 小剛
2、編寫讀取映射的類
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author wangzhenjun
 * @date 2022/8/17 9:04
 */
// 要交給spring容器,不然獲取不到值
@Component
// 配置讀取yml文件中前綴以 school開頭的配置可以全部讀取
@ConfigurationProperties(prefix = "school")
// 要有g(shù)et方法,不然無法獲取值
@Data
public class School {
    // 名稱要與yml一致
    private String teacher;
    private List<String> studentList;
}
3、在Controller進(jìn)行測試
@RestController
@RequestMapping("/test")
@Slf4j
@RequiredArgsConstructor
public class TestController {
    @Autowired
    private School school;
    @GetMapping("/testProperties")
    public void testProperties(){
        log.info("讀取yml的school對象:{}",school);
    }
}
4、debug進(jìn)行看一下

5、為什么推薦第二種方式
我們找到y(tǒng)ml文件,按住Ctrl鼠標(biāo)點(diǎn)擊port,進(jìn)去看一下spring官方是怎么配置的!

我們來到ServerProperties這個配置類上看到:
public void setPort(Integer port) {
    this.port = port;
}我們發(fā)現(xiàn)port是一個成員變量,我們直接看一下這個類吧!
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
    /**
     * Server HTTP port.
     */
    private Integer port;
}
我們看到spring也是使用第二種方式進(jìn)行讀取yml的內(nèi)容的!
四、驗(yàn)證第二種方式實(shí)時更新
nacos這里小編就不帶大家整合到項(xiàng)目中了,小編直接演示效果哈!
1、nacos上配置yml
school:
 teacher: 王老師
 studentList:
   - 小明
   - 小剛

讀取的配置和第二種方式那個School一樣!
2、Controller獲取
@RestController
@RequiredArgsConstructor
@RequestMapping("/zone")
public class ZoneController {
    @Autowired
    private School school;
    @GetMapping("/test")
    public R test() {
        return R.ok(school);
    }
3、postman測試

4、修改配置
我們修改配置不重啟項(xiàng)目:

在次測試:

大功告成!完結(jié)撒花嘍!!
五、總結(jié)
第二種方式:@ConfigurationProperties是非常推薦大家使用的,能夠規(guī)范和生產(chǎn)環(huán)境中動態(tài)生效!真的很香啊!項(xiàng)目中的@Value()去修改修改吧?。∪绻恍枰獎討B(tài)更新的,看個人情況修改哈!