所有分类
  • 所有分类
  • 未分类

SpringBoot–用类表示yml配置文件的值

简介

说明

对于application.yml里边的配置,我们可以通过@Value来获得,比如:@Value(“${user.name}”)。但是,如果属性很多,写很多个@Value就会很繁琐。

解决方案就是:使用@ConfigurationProperties,将一组属性通过一个类来接收。

注意

  1. 保存属性的类必须加getter和setter。
  2. prefix不能有这些:大写字母、某些特殊字符(比如:_、~、!、@、#、$、*、+、:等)
    1. 可以包含的字符有:-

@ConfigurationProperties与@Value的区别

@ConfigurationProperties@Value
类型Map、内部类、对象等。不支持内部类、对象。
spEl表达式不支持支持
JSR303数据校验支持不支持
功能一个列属性批量注入单属性注入

使用方法

法1:@ConfigurationProperties+@Component

@Component
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
    private String name;
    private List<String> emails;
    private Map<String, Integer> price;

    // getter and setter
}

法2:@ConfigurationProperties+@Bean

此时HelloProperties不需要加任何注解。 

配置类

@Configuration
public class Config {
    @Bean
    @ConfigurationProperties(prefix = "hello")
    public HelloProperties helloProperties(){
        return new HelloProperties();
    }
}

实体类

public class HelloProperties {
    private String name;
    private List<String> emails;
    private Map<String, Integer> price;

    // getter and setter
}

法3:@EnableConfigurationProperties+@ConfigurationProperties

在有@Configuration注解的类上加@EnableConfigurationProperties来声明。

配置类

@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloConfiguration {

}

实体类

@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
    private String name;
    private List<String> emails;
    private Map<String, Integer> price;

    // getter and setter
}

实例

application.yml

hello:
  relaxed:
    enabled: true
    helloname1: helloname1
    helloName2: helloName2
    HELLONAME3: HELLONAME3
    hello-name4: hello-name4
    hello_name5: hello_name5
    HELLO-NAME6: HELLO-NAME6

    hiname1: hiname1
    hiName2: hiName2
    HINAME3: HINAME3
    hi-name4: hi-name4
    hi_name5: hi_name5
    HI-NAME6: HI-NAME6

    child:
      childName1: childName
      id: 1000

配置类及属性类

配置类

package com.example.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfigPropConf {
    @Bean
    @ConfigurationProperties(prefix = "hello.relaxed")
    public HelloProperties httpsProperties() {
        return new HelloProperties();
    }
}

顶层属性类

package com.example.config;
import lombok.Data;

@Data
public class HelloProperties {
    private Boolean enabled;

    private String helloName1;
    private String helloName2;
    private String helloName3;
    private String helloName4;
    private String helloName5;
    private String helloName6;

    private String hiname1;
    private String hiname2;
    private String hiname3;
    private String hiname4;
    private String hiname5;
    private String hiname6;

    private ChildProperties child;
}

子层属性类

package com.example.config;
import lombok.Data;

@Data
public class ChildProperties {
    private String child_Name1;

    private Long id;
}

Controller

package com.example.controller;

import com.example.config.HelloProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

@RestController
@RequestMapping("/hello")
public class HelloController {
    @Autowired
    private HelloProperties helloProperties;

    @GetMapping("/prop")
    public HelloProperties prop() {
        return helloProperties;
    }
}

测试

访问:http://localhost:8080/hello/prop

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录