在 Spring Boot 中,配置文件有两种不一样的格式,一个是 properties ,另外一个是 yaml 。java
虽然 properties 文件比较常见,可是相对于 properties 而言,yaml 更加简洁明了,并且使用的场景也更多,不少开源项目都是使用 yaml 进行配置(例如 Hexo)。除了简洁,yaml 还有另一个特色,就是 yaml 中的数据是有序的,properties 中的数据是无序的,在一些须要路径匹配的配置中,顺序就显得尤其重要(例如咱们在 Spring Cloud Zuul 中的配置),此时咱们通常采用 yaml。关于 yaml ,松哥以前写过一篇文章:Spring Boot 中的 yaml 配置简介。git
本文主要来看看 properties 的问题。github
首先,当咱们建立一个 Spring Boot 工程时,默认 resources 目录下就有一个 application.properties 文件,能够在 application.properties 文件中进行项目配置,可是这个文件并不是惟一的配置文件,在 Spring Boot 中,一共有 4 个地方能够存放 application.properties 文件。spring
按如上顺序,四个配置文件的优先级依次下降。以下:后端
这四个位置是默认位置,即 Spring Boot 启动,默认会从这四个位置按顺序去查找相关属性并加载。可是,这也不是绝对的,咱们也能够在项目启动时自定义配置文件位置。安全
例如,如今在 resources 目录下建立一个 javaboy 目录,目录中存放一个 application.properties 文件,那么正常状况下,当咱们启动 Spring Boot 项目时,这个配置文件是不会被自动加载的。咱们能够经过 spring.config.location 属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找 application.properties 文件。app
此时启动项目,就会发现,项目以 classpath:/javaboy/application.propertie
配置文件启动。前后端分离
这是在开发工具中配置了启动位置,若是项目已经打包成 jar ,在启动命令中加入位置参数便可:微服务
java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/javaboy/
对于 application.properties 而言,它不必定非要叫 application ,可是项目默认是去加载名为 application 的配置文件,若是咱们的配置文件不叫 application ,也是能够的,可是,须要明确指定配置文件的文件名。工具
方式和指定路径一致,只不过此时的 key 是 spring.config.name 。
首先咱们在 resources 目录下建立一个 app.properties 文件,而后在 IDEA 中指定配置文件的文件名:
指定完配置文件名以后,再次启动项目,此时系统会自动去默认的四个位置下面分别查找名为 app.properties 的配置文件。固然,容许自定义文件名的配置文件不放在四个默认位置,而是放在自定义目录下,此时就须要明确指定 spring.config.location 。
配置文件位置和文件名称能够同时自定义。
因为 Spring Boot 源自 Spring ,因此 Spring 中存在的属性注入,在 Spring Boot 中同样也存在。因为 Spring Boot 中,默认会自动加载 application.properties 文件,因此简单的属性注入能够直接在这个配置文件中写。
例如,如今定义一个 Book 类:
public class Book { private Long id; private String name; private String author; //省略 getter/setter }
而后,在 application.properties 文件中定义属性:
book.name=三国演义 book.author=罗贯中 book.id=1
按照传统的方式(Spring中的方式),能够直接经过 @Value 注解将这些属性注入到 Book 对象中:
@Component public class Book { @Value("${book.id}") private Long id; @Value("${book.name}") private String name; @Value("${book.author}") private String author; //省略getter/setter }
注意
Book 对象自己也要交给 Spring 容器去管理,若是 Book 没有交给 Spring 容器,那么 Book 中的属性也没法从 Spring 容器中获取到值。
配置完成后,在 Controller 或者单元测试中注入 Book 对象,启动项目,就能够看到属性已经注入到对象中了。
通常来讲,咱们在 application.properties 文件中主要存放系统配置,这种自定义配置不建议放在该文件中,能够自定义 properties 文件来存在自定义配置。
例如在 resources 目录下,自定义 book.properties 文件,内容以下:
book.name=三国演义 book.author=罗贯中 book.id=1
此时,项目启动并不会自动的加载该配置文件,若是是在 XML 配置中,能够经过以下方式引用该 properties 文件:
<context:property-placeholder location="classpath:book.properties"/>
若是是在 Java 配置中,能够经过 @PropertySource 来引入配置:
@Component @PropertySource("classpath:book.properties") public class Book { @Value("${book.id}") private Long id; @Value("${book.name}") private String name; @Value("${book.author}") private String author; //getter/setter }
这样,当项目启动时,就会自动加载 book.properties 文件。
这只是 Spring 中属性注入的一个简单用法,和 Spring Boot 没有任何关系。
Spring Boot 引入了类型安全的属性注入,若是采用 Spring 中的配置方式,当配置的属性很是多的时候,工做量就很大了,并且容易出错。
使用类型安全的属性注入,能够有效的解决这个问题。
@Component @PropertySource("classpath:book.properties") @ConfigurationProperties(prefix = "book") public class Book { private Long id; private String name; private String author; //省略getter/setter }
这里,主要是引入 @ConfigurationProperties(prefix = "book") 注解,而且配置了属性的前缀,此时会自动将 Spring 容器中对应的数据注入到对象对应的属性中,就不用经过 @Value 注解挨个注入了,减小工做量而且避免出错。
application.properties 是 Spring Boot 中配置的一个重要载体,不少组件的属性均可以在这里定制。它的用法和 yaml 比较相似,关于 yaml 配置,你们能够参考 Spring Boot 中的 yaml 配置简介 。
本文案例我已上传到 GitHub:https://github.com/lenve/javaboy-code-samples
好了,有问题欢迎留言讨论。
关注公众号【江南一点雨】,专一于 Spring Boot+微服务以及先后端分离等全栈技术,按期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!