淘先锋技术网

首页 1 2 3 4 5 6 7

记录: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日