记录:398
场景:在Spring Boot的微服务中从application.yml等yml文件中加载自定义配置内容。使用@Value直接加载单个配置。使用@ConfigurationProperties注解把一个或者多个配置加载为Java对象。
版本:JDK 1.8,SpringBoot 2.6.3
1.使用@Value注解加载配置
使用注解@RestController、@Service、@Component等标记的类中,都可以使用@Value注解从yml文件中加载配置取值。
1.1在yml文件配置
hub:
example:
city-name: '杭州'
1.2使用@Value取值
@Value("${hub.example.city-name}")
private String cityName;
2.从yml文件加载配置为普通Java对象
在Java类上,加@ConfigurationProperties注解,实现从yml文件加载配置为普通Java对象。
注解@ConfigurationProperties的属性prefix是指定扫描yml文件中的配置的前缀。
注解@Component指定该类交给Spring创建Bean对象。
使用时,在类变量上加@Autowired直接注入就可以取值。
2.1在yml文件配置
hub:
example:
city:
city-id: 330100
city-name: '杭州'
2.2对应Java类
@Component
@ConfigurationProperties(prefix = "hub.example.city")
public class CityProperties {
private Long cityId;
private String cityName;
public Long getCityId() {
return cityId;
}
public void setCityId(Long cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String toString() {
return "CityProperties(cityId=" + cityId + ",cityName=" + cityName + ")";
}
}
3.从yml文件加载配置为List类型
在Java类上,加@ConfigurationProperties注解,实现从yml文件加载配置为List类型。
注解@ConfigurationProperties的属性prefix是指定扫描yml文件中的配置的前缀。
注解@Component指定该类交给Spring创建Bean对象。
使用时,在类变量上加@Autowired直接注入就可以取值。
3.1在yml文件配置
在yml文件中的短横线"-"代表是List类型属性。
hub:
example:
province:
province-id: 330000
province-name: '浙江'
city-list:
- city-id: 330100
city-name: '杭州'
- city-id: 330201
city-name: '宁波'
3.2对应Java类
@Component
@ConfigurationProperties(prefix = "hub.example.province")
public class ProvinceProperties {
private Long provinceId;
private String provinceName;
private List<CityProperties> cityList;
public Long getProvinceId() {
return provinceId;
}
public void setProvinceId(Long provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
public List<CityProperties> getCityList() {
return cityList;
}
public void setCityList(List<CityProperties> cityList) {
this.cityList = cityList;
}
public String toString() {
return "ProvinceProperties(provinceId=" + provinceId + ",provinceName=" + provinceName +",cityList=" +cityList.toString()+")";
}
}
4.从yml文件加载配置为static属性
在Java类上,加@ConfigurationProperties注解,实现从yml文件加载配置赋值给Java类的static属性。
注解@ConfigurationProperties的属性prefix是指定扫描yml文件中的配置的前缀。
注解@Component指定该类交给Spring创建Bean对象。
使用时,直接使用类名加属性名或者类名加方法名就可以取值。
4.1在yml文件配置
hub:
example:
static-city:
city-id: 330201
city-name: '宁波'
4.2对应Java类
在Java类中,属性必须是static修饰。get方式必须是static修饰。set方法不能使用static修饰。
@Component("staticCityProperties")
@ConfigurationProperties(prefix = "hub.example.static-city")
public class StaticCityProperties {
private static Long cityId;
private static String cityName;
public static Long getCityId() {
return cityId;
}
public void setCityId(Long cityId) {
StaticCityProperties.cityId = cityId;
}
public static String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
StaticCityProperties.cityName = cityName;
}
}
5.应用
本例在Controller类中应用以上功能。
5.1应用
@RestController
@RequestMapping("/hub/example/load")
@Slf4j
public class LoadController {
//使用@Value加载yml配置
@Value("${hub.example.city-name}")
private String cityName;
//使用@Autowired注入属性
@Autowired
private CityProperties city;
@Autowired
private ProvinceProperties province;
@PostMapping("/loadData")
public Object loadData() {
log.info("1.使用@Value从yml文件加载配置: " + cityName);
log.info("2.从yml文件加载配置为普通Java对象: " + city.toString());
log.info("3.从yml文件加载配置为List类型: " + province.toString());
log.info("4.从yml文件加载配置为static属性: " + StaticCityProperties.getCityName());
return "执行成功";
}
}
5.2输出结果
1.使用@Value从yml文件加载配置: 杭州
2.从yml文件加载配置为普通Java对象: CityProperties(cityId=330100,cityName=杭州)
3.从yml文件加载配置为List类型: ProvinceProperties(provinceId=330000,provinceName=浙江,cityList=[CityProperties(cityId=330100,cityName=杭州), CityProperties(cityId=330201,cityName=宁波)])
4.从yml文件加载配置为static属性: 宁波
以上,感谢。
2023年4月11日