在Spring Boot中,配置文件是application.yml或者application.properties。
yml配置文件的语法主要有以下几点:
其中value的可以是简单数据类型(数字、字符串),也可以是复杂数据类型(数组、对象、集合、Map等)。
注意:对于字符串,默认是不需要加双引号或者单引号。
假设配置文件内容如下:
coder: name: smartpig //简单数据 lang: [Java,Kotlin] //List softwares: {cut: pr,image: ps} //Map pet: //对象 name: bigdog type: dog 复制代码
在控制器中,使用@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()); } } 复制代码
输入结果为配置文件中的值
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> </dependency> 复制代码
如果使用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 |
---|---|---|
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。
感谢观看~