前言:学过或者使用过springboot框架的时候,大家会发现,springboot中的配置文件有两种方式,分别是.properties格式和.yaml格式,这两个都是配置文件,但是他们有什么不同呢?
1.位置问题
创建Spring Boot项目时,默认 resources 目录下就有一个application.properties 文件,可以在 application.properties 文件中进行项目配置,但是这个文件并非唯一的配置文件,在 Spring Boot 中,一共有 4 个地方可以存放该配置文件,并按照如下优先级依次降低,如下:
springboot项目启动时,默认会从如上四个位置依次查找配置文件属性并加载,但是我们也可以自定义配置文件位置,如:在resource目录下创建一个test目录,test目录下创建一个application.properties配置文件,但这个文件不会自动加载,这就需要我们通过spring.config.location去指定配置文件位置,此时启动项目,项目将以 classpath:/test/application.properties 配置文件启动如下:
2.文件名问题
到这里可能就会有人发出疑问了,配置文件一定要是application.properties吗?我们知道配置文件后缀名properties是必须的,其实application其实是可以换的,但是因为在springboot项目中默认加载名为application,所以我们默认都写application,那如何更换名字呢?
如:我们在resource目录下创建一个叫loadme.properties文件,然后在IEDA配置中去指定:
指定完成后,启动项目系统还是会从上面四个位置依次查找,不过是以loadme.properties名字进行查找,也就是配置文件可以自定义配置,只需要spring.config去指定配置
3.普通属性注入
springboot源于spring,所以在springboot项目中属性注入依然存在,springboot 项目中,默认会自动加载 application.properties 文件,所以简单的属性注入可以直接在这个配置文件中写
one.定义一个student类:
public class Student {
private String userId;
private String userName;
private String sex;
}
two.在 application.properties 文件中定义属性
student.userId=9527
student.userName=王小帅
student.sex=男
three.直接通过 @Value 注解将这些属性注入到 Student对象中
@Component
public class Student {
@Value("${student.userId}")
private String userId;
@Value("${student.userName}")
private String userName;
@Value("${student.sex}")
private String sex;
}
four.Student对象本身也要交给 Spring 容器去管理,如果 Student 没有交给 Spring 容器,那么 Student 中的属性也无法从 Spring 容器中获取到值;配置完成后,可以选择在 Controller 中注入 Student 对象,启动项目,就可以看到属性已经注入到对象中,如:
etc:一般来说们需要在resource目录下创建一个新的student.properties配置文件从而避免影响application.properties系统配置文件,student.properties和上面一样:
student.userId=9527
student.userName=王小帅
student.sex=男
此时,项目启动并不会自动的加载该配置文件,如果是在 XML 配置中,可以通过如下方式引用该 properties 文件:
<context:property-placeholder location="classpath:student.properties"/>
如果是在 Java 配置中,可以通过 @PropertySource 来引入配置:
@Component
@PropertySource("classpath:student.properties")
public class Student{
@Value("${student.userId}")
private String userId;
@Value("${student.userName}")
private String userName;
@Value("${student.sex}")
private String sex;
当然这是 Spring 中属性注入的一个简单用法,和 Spring Boot 没有任何关系
4.类型安全 属性注入
Spring Boot 引入了类型安全的属性注入,如果采用 Spring 中的配置方式,当配置的属性非常多的时候,工作量大,容易出错,所以我们采用类型安全的属性注入来解决该问题,如下:
@Component
@PropertySource("classpath:student.properties")
@ConfigurationProperties(prefix = "student")
public class Student{
private String userId;
private String userName;
private String sex;
//省略getter/setter
}
引入 @ConfigurationProperties(prefix = “student”) 注解,配置了属性的前缀,此时会自动将 Spring 容器中对应的数据注入到对象对应的属性中,避免通过 @Value 注解依次注入了,减少工作量并且避免出错
鉴于我们上面说了properties的理解之后,实际也包含了yaml一大部分特性,两者其实相差不大,但还是有所区别,接下来我们主要说下相对于properties,yaml特有的属性
代码风格
properties语法:
server.port = 8080
server.address=127.0.0.1
server.servlet.context-path=/test
yml语法:
server:
port: 8080
servlet:
context-path: /test
xml语法:
<server>
<port>8081</port>
</server>
使用yml注意:
总体来说,yaml不同于 properties 文件的无序,yaml 配置有序,这一点在有些配置中是非常有用的,例如在 Spring Cloud Zuul 的配置中,当我们配置代理规则时,顺序就显得尤为重要 ; 当然 yaml 配置也不是万能的,例如,yaml 配置目前不支持 @PropertySource 注解等。
结语:对于springboot项目中的两个配置文件介绍就到这了,以上论述可能有些朋友对yml与yaml不太理解,其实这个对于使用上没有什么大的影响,详细想要了解的话点击这里