我们都知道在Spring中有着application.xml文件对Spring进行相关配置,通过web.xml中的contextConfigLocation指定application.xml文件所在位置进行Spring核心配置,那么在SpringBoot中是怎么实现的呢?SpringBoot核心配置文件的名字是已经规定好的,文件名称是application.properties或application.yml,文件目录默认在/src/main/resources路径下。下面看一下xml和yml在写法中有什么区别。
xml写法
<beans>
<bean id="xxx" class="xxx"></bean>
</beans>
yml写法
person:
name: jane
age: 15
birth: 2005/12/03
bool: true
maps: {k1: v1,k2: v2}
lists:
- bob
- jane
上面是yml的具体写法,但是要强调一下,yml中有几点是必须注意的
1:k:(空格)v: 表示键值对(空格必须有)
2:以空格缩进来控制成绩关系:只要是左对齐的数据都是同一层级的
3:属性和值大小写敏感
4:k:v直接写 字符串默认不需要加单引号和双引号,单引号会转义特殊字符,双引号不会转义特殊字符。
既然已经知道具体写法了,那么SpringBoot是如何获取配置文件中的值呢?先来说一下获取yml中值得方法。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
这里要说明下为什么要在pom.xml中引入这个依赖,由于SpringBoot在获取yml中的数据时需要使用@ConfigurationProperties注解,所以需要添加上面的依赖。
javaBean
@ConfigurationProperties(prefix ="person")
//告诉springboot将本类中所有的属性和配置文件中相关配置进行绑定
@Configuration
@Component
public class Person {
private String name;
private Integer age;
private Boolean bool;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
测试
@Controller
public class HelloController {
@Autowired
Person person;
@ResponseBody
@RequestMapping("/hello")
public String Hello(){
System.out.println(person);
return "Hello World";
}
}
请求结果
这里可以看到已经获取到yml中的属性值。
下面说一下如何获取properties文件中的属性值
properties
person.name=jane
person.age=15
person.birth= 2005/12/03
person.bool=true
javaBean
@Configuration
@Component
public class Person {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private Integer age;
@Value("${person.bool}")
private Boolean bool;
@Value("${person.birth}")
private Date birth;
请求结果
相信已经有人看到我在yml中是有获取map和list的但是在properties中却没有,这就是yml和properties相比较最重要的一个区别,yml支持复杂类型封装而properties不支持
下面说一下@ConfigurationProperties注解和@value注解得区别
| ConfigurationProperties | value |
功能 | 批量注入 | 单个注入 |
松散语法绑定 | 支持 | 不支持 |
spEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 (maps,lists) |
虽然SpringBoot中为我们提供了application.xml/properties配置文件,但是当我们项目中遇到很多类都需要进行配置的话该怎么办呢,总不能把所有的属性都写在一个配置文件中吧,
所以下面说一下如何自定义yml/properties配置文件目录。SpringBoot为我们提供了俩个注解@PropertySource和@ImportResource。
这里需要注意的是@PropertySource用来导入yml和properties文件,而@ImportResource用来导入外部的xml文件,由于我使用@ImportResource导入yml时遇到如下错误
javaBean
@ConfigurationProperties(prefix ="person")
@ImportResource("classpath:/config/person.yml")
//告诉springboot将本类中所有的属性和配置文件中相关配置进行绑定
@Configuration
@Component
public class Person {
private String name;
private Integer age;
private Boolean bool;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
启动时报错
前言中不允许有空内容,然后我就去百度翻阅了很多内容,有一个博主也遇到相同的问题,他也在网上翻阅了很多资料发现很多人可能都是复制粘贴的,解决的办法都是就是用notePad方式打开文件,然后保存为 UTF-8 with no BOM 的方式。但是我经过尝试发现还是不行。下面看一下使用@PropertySource注解
javaBean
ConfigurationProperties(prefix ="person")
@PropertySource("classpath:/config/person.yml")
//告诉springboot将本类中所有的属性和配置文件中相关配置进行绑定
@Configuration
@Component
public class Person {
private String name;
private Integer age;
private Boolean bool;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
目录结构
运行结果
可以看到没有问题,同理获取properties也是一样的,这里就不过多举例了。
在很长的一段时间我变的颓废混日子,甚至忘了当初选择这个行业的初衷,总是喜欢抱怨种种得不公,我希望以后的日子我能找回那个努力的自己,没有人愿意平平淡淡,碌碌无为过一生,不求无愧于他人,但求无愧于自己,也希望每个在这个行业里为之坚持的伙伴我们都能无愧于自己,成为那个想象中的自己。