阅读 115

Spring Boot配置文件注入

在Spring Boot中,配置文件是application.yml或者application.properties。

yml语法

yml配置文件的语法主要有以下几点:

  • key:[space] value
  • 大小写敏感
  • 空格(Tab)控制层级关系

其中value的可以是简单数据类型(数字、字符串),也可以是复杂数据类型(数组、对象、集合、Map等)。

注意:对于字符串,默认是不需要加双引号或者单引号。

配置文件注入

假设配置文件内容如下:

coder:
  name: smartpig  //简单数据
  lang: [Java,Kotlin] //List
  softwares: {cut: pr,image: ps} //Map
  pet:  //对象
    name: bigdog
    type: dog
复制代码
  • 使用@Value获取配置文件中的值

在控制器中,使用@Value(“${}”)获取配置文件中的值,如下获取了coder中name的值

@Controller
public class Hello {
    @Value("${coder.name}")
    private String name;

    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "hello "+ name;
    }
}
复制代码
  • 使用@ConfigurationProperties(perfix="")和@Compent与配置文件进行映射

    编写Pet类,编写Coder类

@Component
@ConfigurationProperties(prefix = "coder")
public class Coder {
    private String name;
    private List<String> lang; //数组
    private Map<String,String> softwares; //Map
    private Pet pet; //对象
    //省略getter/setter/toString
}
复制代码

然后在测试类中进行测试

@SpringBootTest
class DemoSpringbootApplicationTests {
    @Autowired
    Coder coder;
    
    @Test
    void contextLoads() {
        System.out.println(coder.toString());
    }
}
复制代码

输入结果为配置文件中的值

使用插件使得在yml中编写对应配置有提示效果

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
复制代码

在properties配置文件中进行映射

如果使用properties配置文件,除了书写格式不同,其他操作都是和yml相同的。

coder.name=smartpig
coder.lang=Java,Kotlin
coder.softwares.cut=pr
coder.softwares.image=ps
coder.pet.name=bigdog
coder.pet.type=dog
复制代码

@Value和@ConfigurationProperties的区别

序号 @Value @ConfigurationProperties
1 单个注入 批量注入
2 支持EL表达式 不支持EL表达式
3 不支持校验 支持校验
4 不支持自动转换为驼峰命名 支持自动转为驼峰命名
5 不支持复杂类型注入 支持复杂类型注入
  • EL表达式

    将配置文件中的修改为如下

    coder:
      name: ${smartpig} //改为EL表达式
      lang: [Java,Kotlin]
      softwares: {cut: pr,image: ps}
      pet:
        name: bigdog
        type: dog
    复制代码

    使用@ConfigurationProperties时会报错:Could not resolve placeholder 'smartpig' in value "${smartpig}";使用@Value则不会报错

  • 校验

    在Coder类中增加校验,验证coder.name不为空串

    @Component
    @Validated
    @ConfigurationProperties(prefix = "coder")
    public class Coder {
        @NotEmpty
        private String name;
    }
    复制代码

    配置文件改为

    coder:
      name:  //改为empty
      lang: [Java,Kotlin]
      softwares: {cut: pr,image: ps}
      pet:
        name: bigdog
        type: dog
    复制代码

    使用@ConfigurationProperties时会报错:

    Property: coder.name
    Value: 
    Origin: class path resource [application.yml]:2:8
    Reason: 不能为空
    复制代码

    使用@Value不会进行校验

  • 复杂类型

    使用@Value注入coder.name没有问题,如果使用@Value注入复杂类型,比如List

    @Component
    //@ConfigurationProperties(prefix = "coder")
    public class Coder {
        private String name;
        @Value("${coder.lang}")  //使用复杂类型注入lang
        private List<String> lang;
        private Map<String,String> softwares;
        private Pet pet;
    }
    复制代码

    将会报错:Could not resolve placeholder 'coder.lang' in value "${coder.lang}"

总结

今天和大家分享了配置文件数据如何注入到变量或者类中;对于少量数据可以使用@Value,但是如果数据比较复杂时可以使用@ConfigurationProperties。

感谢观看~

关注下面的标签,发现更多相似文章
评论