Springboot系列-理解application.properties和application.yaml

Springboot系列-理解application.properties和application.yaml

前言:学过或者使用过springboot框架的时候,大家会发现,springboot中的配置文件有两种方式,分别是.properties格式和.yaml格式,这两个都是配置文件,但是他们有什么不同呢?

application.properties

1.位置问题

创建Spring Boot项目时,默认 resources 目录下就有一个application.properties 文件,可以在 application.properties 文件中进行项目配置,但是这个文件并非唯一的配置文件,在 Spring Boot 中,一共有 4 个地方可以存放该配置文件,并按照如下优先级依次降低,如下:

  1. 当前项目根目录的config下
  2. 当前项目根目录下
  3. resource目录的config目录下
  4. resource目录下

在这里插入图片描述

springboot项目启动时,默认会从如上四个位置依次查找配置文件属性并加载,但是我们也可以自定义配置文件位置,如:在resource目录下创建一个test目录,test目录下创建一个application.properties配置文件,但这个文件不会自动加载,这就需要我们通过spring.config.location去指定配置文件位置,此时启动项目,项目将以 classpath:/test/application.properties 配置文件启动如下:

在这里插入图片描述

启动springboot项目,运行结果如下:
在这里插入图片描述

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 注解依次注入了,减少工作量并且避免出错


yaml

鉴于我们上面说了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注意:

  • 不同“等级” 用冒号隔开
  • 次等级的前面是空格,不能使用制表符(tab)
  • 冒号之后如果有值,那么冒号和值之间至少有一个空格,避免紧贴
  • 要么用application.properties 要么用 application.yml,不要都用使自己混乱

总体来说,yaml不同于 properties 文件的无序,yaml 配置有序,这一点在有些配置中是非常有用的,例如在 Spring Cloud Zuul 的配置中,当我们配置代理规则时,顺序就显得尤为重要 ; 当然 yaml 配置也不是万能的,例如,yaml 配置目前不支持 @PropertySource 注解等。

结语:对于springboot项目中的两个配置文件介绍就到这了,以上论述可能有些朋友对yml与yaml不太理解,其实这个对于使用上没有什么大的影响,详细想要了解的话点击这里

  • 22
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值