一、前言 我們在開發中會經常遇到一些可能會變的值,比如資料庫的密碼,一些關鍵鏈接的配置等等。 都需要我們寫在配置文件中,這樣可以把這些配置文件放到nacos上進行管理,修改nacos的配置,咱們發佈的包就可以動態的進行更新了,不需要重新修改打包在重新發包! 咱們今天就來說一說讀取配置文件中的值常見的 ...
一、前言
我們在開發中會經常遇到一些可能會變的值,比如資料庫的密碼,一些關鍵鏈接的配置等等。
都需要我們寫在配置文件中,這樣可以把這些配置文件放到nacos上進行管理,修改nacos的配置,咱們發佈的包就可以動態的進行更新了,不需要重新修改打包在重新發包!
咱們今天就來說一說讀取配置文件中的值常見的兩種方法,剛剛說的動態更新配置的是第二種配置哈!@Value("${school.teacher}")
不會動態更新,所以小編推薦使用第二種方式@ConfigurationProperties(prefix = "school")
進行讀取配置文件!下麵小編 也會帶大家一起演示一下不需要重啟項目就可以動態的更新,在生產上非常的好用!!!
二、第一種方式
第一種方式比較場景,也是最簡單的,就是@Value($(配置文件中的參數))
我們首先在application.yml文件中寫一個配置:
school:
teacher: 王老師
student: 小明
這裡key的冒號後面一定要有個空格,字元串不需要加雙引號!
我們為了方便直接在controller進行演示了!!
@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
麻煩不少,但是更加的規範,在配合nacos的時候也可以動態的修改,會立即生效,一會小編帶大家試一下哈!!為什麼推薦這種方式呢,是因為spring他們都是使用這種方式進行配置的,所以跟著官方走不會有錯的!!
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")
// 要有get方法,不然無法獲取值
@Data
public class School {
// 名稱要與yml一致
private String teacher;
private List<String> studentList;
}
3. 在Controller進行測試
@RestController
@RequestMapping("/test")
@Slf4j
@RequiredArgsConstructor
public class TestController {
@Autowired
private School school;
@GetMapping("/testProperties")
public void testProperties(){
log.info("讀取yml的school對象:{}",school);
}
}
4. debug進行看一下
5. 為什麼推薦第二種方式
我們找到yml文件,按住Ctrl
滑鼠點擊port
,進去看一下spring官方是怎麼配置的!
我們來到ServerProperties
這個配置類上看到:
public void setPort(Integer port) {
this.port = port;
}
我們發現port是一個成員變數,我們直接看一下這個類吧!
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
/**
* Server HTTP port.
*/
private Integer port;
}
我們看到spring也是使用第二種方式進行讀取yml的內容的!!
四、驗證第二種方式實時更新
nacos這裡小編就不帶大家整合到項目中了,小編直接演示效果哈!
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. 修改配置
我們修改配置不重啟項目
在次測試:
大功告成!完結撒花嘍!!
五、總結
第二種方式:@ConfigurationProperties
是非常推薦大家使用的,能夠規範和生產環境中動態生效!!真的很香啊!!項目中的@Value()
去修改修改吧!!如果不需要動態更新的,看個人情況修改哈!!
有緣人才可以看得到的哦!!!