在 Spring Boot 中,配置文件有两种不同的格式,一个是 properties ,另一个是 yaml 。
虽然 properties 文件比较常见,但是相对于 properties 而言,yaml 更加简洁明了,而且使用的场景也更多,很多开源项目都是使用 yaml 进行配置(例如 Hexo)。除了简洁,yaml 还有另外一个特点,就是 yaml 中的数据是有序的,properties 中的数据是无序的,在一些需要路径匹配的配置中,顺序就显得尤为重要(例如我们在 Spring Cloud Zuul 中的配置),此时我们一般采用 yaml。关于 yaml ,松哥之前写过一篇文章:Spring Boot 中的 yaml 配置简介。
本文主要来看看 properties 的问题。
首先,当我们创建一个 Spring Boot 工程时,默认 resources 目录下就有一个 application.properties 文件,可以在 application.properties 文件中进行项目配置,但是这个文件并非唯一的配置文件,在 Spring Boot 中,一共有 4 个地方可以存放 application.properties 文件。
当前项目根目录下的 config 目录下
当前项目的根目录下
resources 目录下的 config 目录下
resources 目录下
按如上顺序,四个配置文件的优先级依次降低。如下:
这四个位置是默认位置,即 Spring Boot 启动,默认会从这四个位置按顺序去查找相关属性并加载。但是,这也不是绝对的,我们也可以在项目启动时自定义配置文件位置。
例如,现在在 resources 目录下创建一个 javaboy 目录,目录中存放一个 application.properties 文件,那么正常情况下,当我们启动 Spring Boot 项目时,这个配置文件是不会被自动加载的。我们可以通过 spring.config.location 属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找 application.properties 文件。
此时启动项目,就会发现,项目以 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
好了,有问题欢迎留言讨论。
喜欢就点个"在看"呗^_^
文章浏览阅读653次。js实现更改字体的颜色、样式等_js怎么改文本字体颜色
文章浏览阅读190次。导读:该文是关于静电点电荷论文范文,为你的论文写作提供相关论文资料参考。王静 王亚芳 董爱国 程方锐 张瑞杰 吕砚荻(中国地质大学(北京)物理实验示范中心 北京 100083)摘 要:Matlab是一种功能强大、效率高、便于进行科学和工程计算的交互式软件包.本文使用Matlab软件,给出点电荷和“无限长”直导线,以及同轴圆柱电极产生的静电场的等势线分布图.结果表明利用Matlab软件..._程方锐博士
文章浏览阅读1.5k次。前面跟大家提到过 elementUI验证的问题,那么今天就来看看 点击对话框和关闭按钮 怎么清空验证,清空form表单,避免二次点击还会有 验证错误的提示1、首先在你的对话框 取消按钮 加一个click事件,例如:(ps::callOf里面的addGroupData和ref一 一对应起来)取 消确 定2、点击取消按钮,关闭对话框,清除表单验证callOf(formName){this.creatG..._清除所有elementui form清楚表格交验
文章浏览阅读3.7k次。一开始用localStorage,不论打开多少个页面,哪怕关掉重新打开,同一个网站下的存储的数值还在,问题是,不能同时登录多个账户,以及设置过期时间等后来启用sessionStorage,可以登录多个账户了,页面一关存储的数值也会自动被清掉,不存在安全问题;但来了新的问题,登录后,父页面跳转打开的新页面,两个页面之间的值无法共享了。后来想了一下,可以利用window.opener来解决,自己写..._sessionstorage 不共享
文章浏览阅读1.2k次。我这里用的是idea2019.2的版本第一步:第二步:第三步:第四步:剩下的直接next_idea怎么导入父子结构的maven项目
文章浏览阅读102次。Communication channels are an essential element of every communication system. These channels actually carry the data from one computer to another. There are two categories of communication channels. ..._fiber-optic cable transmits data
文章浏览阅读5.8k次,点赞44次,收藏59次。想和业界的技术大牛并肩作战?想学习最前沿的技术?想参与超酷的大项目?想获得亿万用户的点赞?蚂蚁金服春季校招开启了!面试很难?没有信心?这都不是事儿,这儿有一系列的“面试宝典”。文/图 源介我是 2018 年 3 月入职蚂蚁的应届前端工程师,来自于北京邮电大学。2 年前的此刻,我也是实习求职大潮中的一员,在这里,分享一下我从准备面试到实习,再到最终正式入职的经历。选择蚂蚁阿里的前端水..._蚂蚁金服入职要求
文章浏览阅读2.6k次。关键字(keywords):SVM支持向量机 SMO算法 实现机器学习假设对SVM原理不是非常懂的,能够先看一下入门的视频,对帮助理解非常实用的,然后再深入一点能够看看这几篇入门文章,作者写得挺具体,看完以后SVM的基础就了解得差点儿相同了,再然后买本《支持向量机导论》作者是Nello Cristianini 和 John Shawe-Taylor,电子工业出版社的。然后把书本后面的那个SMO..._机器学习算法 java实现
文章浏览阅读3.1k次。win7系统发现桌面右下角网络图标显示红叉或图标正常不能上网,并且打开网络和共享中心显示,依赖的服务或组无法启动,这时候我们需要打开Wlan autoconfig服务。但是在服务项目中找到Wlan autoconfig服务是启用时显示错误代码为1068,怎么才能解决这个问题呢?接下去系统城小编为大家讲解解决方法。1、我们来win7系统的桌面,点击开始在菜单中点击“运行”;2、点击运行弹出来的运行..._win7wlan依赖服务1068错误 csdn
文章浏览阅读400次。附加进程调试_插件附加进程调试的步骤
文章浏览阅读6k次。《java笔试题答案详解[共7页]》由会员分享,可在线阅读,更多相关《java笔试题答案详解[共7页](7页珍藏版)》请在人人文库网上搜索。1、java笔试题以及答案详解 一 一、单项选择题 1Java是从()语言改进重新设计。AAda BC+ CPasacal DBASIC答案:B2下列语句哪一个正确()A Java程序经编译后会产生machine codeB Java程序经编译后会产生byte..._数组是一种对象还是原生类
文章浏览阅读141次。Starting with Oracle9i you have the ability to view the estimated CPU, TEMP and I/O costs for every SQL execution ..._optimizer_cost