SpringBoot中的application.properties外部注入覆盖
由想要忽略properties中的某些属性,引发的对SpringBoot中的application.properties外部注入覆盖,以及properties文件使用的思考。
SpringBoot 配置文件application.properties配置参数替换或者注入的几种方式
之所以研究这个问题,原因是因为,我的项目如果通过git备份到码云上之后,mysql以及redis的密码也保存上去了,这样肯定是不行的,但是我如果忽略application.properties的话,就缺失了关键的配置信息;该怎么办呢?
我开始的想法是能不能把这些密码参数放到另一个properties中,然后通过注入(类似把properties中的常量注入到java文件中,或者是properties文件,同一个文件内引用${}的方式),所以按照这种注入的思维百度了很久,但是都没有找到解决办法…
加载顺序引入
后来师兄告诉我,你可以通过SpringBoot加载目录顺序来进行配置文件优先级覆盖,不用注入,在另一个地方写一个application.properties,利用SpringBoot加载顺序不同,优先级不同,在resources目录下新建一个config目录,在config目录下新建一个application.properties,在resources/config/application.properties下的配置加上密码之类的,而resources/application.properties中放上配置信息,所有的密码地址,等隐私信息给成默认的值就行了,比如localhost或者root
注意:这里的加载顺序是越往后越优先,后面覆盖前面的,和SpringBoot静态资源的顺序不同
顺便补充静态资源的加载顺序:/META-INF/resources/ > /resources/ > /static/ > /public/,这种顺序不同,当然如果你在application.properties中重写了spring.resources.static-locations,那另当别论,重写之后按照定义的顺序进行加载
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/mzywucai/
师兄说了之后,我就去了解了一下SpringBoot的加载顺序:
SpringBoot配置文件的加载顺序
SpringBoot的配置文件可以放在四个地方,读取顺序不同(以下yml和properties均是如此):
读取顺序分别是(越靠前越优先,优先越高的地方读取到了就不会读取后面的了)
1.项目根目录中的config/application.properties
2.项目根目录下的application.properties
3.项目src/main/resources/config/下的appliacation.properties
4.项目src/main/resources/下的application.properties(我们最常见的那个application.properties)
java -jar 时参数注入application.properties核心参数
但是我又出现了一个问题,在做完学院的设备管理之后,老师要求系统要改改占用的端口,方便管理,但是我每次只改一个server.port就要重新打包,岂不是很不划算?
所以看到了那啥快看的博客园,读了博主的文章,还额外解除了许多疑惑!
1.参数通过properties注入类的时候,如果是在application.properties中不用加上@PropertySource({“classpath:application.properties”})
// 博主在文中写到,如果是在application.properties中的常量,
// 那么忘类中注入常量的时候,就不用在类上面声明
// @PropertySource({"classpath:application.properties"})
// 只有在名字为其它的properties配置文件的时候,才需要声明@PropertySource({"xxx.properties"})
// 例如:
// @PropertySource({"classpath:resource.properties"})
// 然后在类中的成员变量上加上注解:@Value("${配置文件的全名称}") 就行了
// 可以看到这里的@PropertySource({"xxx.properties", "xxx", "yyy"})里面是个对象,可以加载多个properties文件
// 有时候我们注入的参数过多,并且前缀相同的时候
// 就可以使用 @ConfigurationProperties(prefix = "test")
// 但是此时切记不要写@Value("${}"),加了前缀之后,就是自动注入了,不能再加@Value("${}")注解了
// 案例如下:
案例:
# resource.properties中的内容
# 测试配置文件注入实体类
test.name=mzywucai
test.domain=192.168.60.179,192.168.60.180,192.168.60.181
# 利用值注入还可以做很多有趣儿的事情,比如随机值的生成,可以简化代码
# 那啥快看的博客园
# ---------------------------------
dudu.secret=${random.value}
dudu.number=${random.int}
dudu.bignumber=${random.long}
dudu.uuid=${random.uuid}
dudu.number.less.than.ten=${random.int(10)}
dudu.number.in.range=${random.int[1024,65536]}
# ---------------------------------
package club.mzywcuai.springbootquickstart.pojo.domain;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* @author mzywucai
* @Description
* @date 2018/10/21
*/
@Component // 加此注解是为了让SpringBoot扫描
// 如果是application.properties就不用写了!
@PropertySource({"classpath:resource.properties"})
// @ConfigurationProperties // 此注解对应下面使用@Value手动分配的时候
// 注意如果写了前缀了的话,就不用写@Value("${xxx...}")了
// 就自动帮我们映射了!但是注意properties中出去前缀后的部分要和我们的实体类中的字段名要相同!
@ConfigurationProperties(prefix = "test")
public class ServerSettings {
// 名称
// @Value("${test.name}")
private String name;
// 域名地址
// @Value("${test.domain}")
private String domain;
public ServerSettings() {}
public ServerSettings(String name, String domain) {
this.name = name;
this.domain = domain;
}
public void setName(String name) {
this.name = name;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getName() {
return name;
}
public String getDomain() {
return domain;
}
}
补充:还有properties的key-value,在properties的参数间引用(我的文件服务器的案例):
server.port=10086
# 主服务器的url,通信确认有资格上传:暂时不会使用
server.main.url=http://localhost:8888/confirm-session
# 文件的路径的base:
## 此处的路径进的修改:ubuntu下可以在用户目录下 nohup java -jar xxx & 启动就好了
## 如果是其它目录的话:加上sudo -> nohup sudo java -jar xxx &
server.file.base=/home/ubuntu/upload
# server.file.base=D:/upload
# 浏览器访问的时候的URI前缀
server.voice.uri=voice
server.video.uri=video
server.image.uri=image
# 语音的路径
server.file.voice=${server.file.base}/${server.voice.uri}
# 视频的路径
server.file.video=${server.file.base}/${server.video.uri}
# 图片的路径
server.file.image=${server.file.base}/${server.image.uri}
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${server.file.base}
# 单个文件大小为20M
spring.servlet.multipart.max-file-size=20MB
# 没有多文件上传,也设定为20M
spring.servlet.multipart.max-request-size=20MB
# 语音的最大size B -> 10M
voice.max-size=10485760
# 视频的最大size B -> 20M
video.max-size=20971520
# 图片的最大size B -> 10M
image.max-size=10485760
扯回正题:以上的种种application.properties的配置参数,其实都可以通过java -jar的时候,以–开头作为command的参数注入!(有些很长,当然如果你不嫌麻烦的话)
一般我们前台运行springboot的jar包的时候:
java -jar xxx.jar
加参数,例如修改server.port:
java -jar xx.jar --server.port=8888
设置运行的模式文件(dev等,这样就能两套文件外部运行的时候选择了,比如正式部署的和运行的区别:开不开页面缓存,设不设置sql打印输出…)
java -jar xxx.jar --spring.profiles.active=dev
作者还额外提到可以通过:SpringApplication.setAddCommandLineProperties(false)禁用command注入,来规避风险。
作者还有提到,SpringBoot获得配置属性的多种途径(学习,摘我知道的):
1.刚刚的命令参数
2.SPRING_APPLICATION_JSON中的属性(环境变量或系统属性中的内联JSON嵌入)。
3.操作系统环境变量
4.应用程序以外的application.properties或者appliaction.yml文件(后面补充细讲)
5.打包在应用程序内的application.properties或者appliaction.yml文件
6.默认属性(通过SpringApplication.setDefaultProperties指定)例如application-dev.properties和application-test.properties
7.在需要注入的类上写@PropertySource标注的属性源(@PropertySource不止能加载项目类的噢,还能加载其它地方的):@PropertySource(“file://application.properties”) file代表协议,http,ftp,你也可以写当前计算机系统下的全路径访问的文件。
以上还有问题,如果最终运行需要调整的参数多,上面的就不好用了!那怎么办呢?
部署时在jar包同级目录加上config文件夹,里面放入写好了部署参数配置的application.properties
参照node2017的博文:
spring boot允许你自定义一个application.properties文件,然后放在以下的地方,来重写spring boot的环境变量或者定义你自己环境变量(优先级同样是先config,再当前,适合在生产环境下部署时使用)
1.当前目录的 “/config”的子目录下
2.当前目录下
以上就是我对注入application.properties,以及SpringBoot中用好properties文件的全部了解
SpringBoot中的application.properties外部注入覆盖的更多相关文章
- springboot中配置文件application.properties的理解
前言 Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来.所以,我们要想把Sprin ...
- springboot中配置文件application.properties的配置详情,数据源配置
pring Boot使用了一个全局的配置文件application.properties,放在src/main/resources目录下或者类路径的/config下.Sping Boot的全局配置文件 ...
- SpringBoot在logback.xml中读取application.properties中配置的日志路径
1.在springboot项目中使用logback记录日志,在logback.xml中配置日志存储位置时读取application.properties中配置的路径,在 logback.xml中配置引 ...
- Spring Boot 中配置文件application.properties使用
一.配置文档配置项的调用(application.properties可放在resources,或者resources下的config文件夹里) package com.my.study.contro ...
- Spring系列之——springboot解析resources.application.properties文件
摘要:本文通过讲解如何解析application.properties属性,介绍了几个注解的运用@Value @ConfigurationProperties @EnableConfiguration ...
- Spring Boot中配置文件application.properties使用
一.配置文档配置项的调用 启动后在浏览器直接输入http://localhost:18080/user/test,就直接打印出配置文件中的配置内容. 二.绑定对象bean调用 有时候属性太多了,一个个 ...
- 如果你的application.properties中还存在明文密码----加密Spring Boot中的application.properties
1 概述 什么?都2020年了还在Spring Boot的配置文件中写明文密码? 虽然是小项目,明文也没人看. 明文简单快捷方便啊!!! 你看直接用户名root密码123456多么简单!!! ... ...
- spring-boot默认的application.properties属性
# =================================================================== # COMMON SPRING BOOT PROPERTIE ...
- Spring Boot中在程序中获得application.properties中的值
方法是使用@Value注解的方式注解一个值. 首先,在我们的application.properties中添加一个值如下: zifeiy.tmpfile.location=D:/duty 然后在我们的 ...
随机推荐
- 【剑指offer】50.数组中重复出现的数字
50.数组中重复出现的数字 知识点:数组:Set的不可重复性 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重 ...
- P4774-屠龙勇士-扩展中国剩余定理
屠龙勇士 很久很久以前,巨龙突然出现,带来了灾难带走公主又消失不见.王国十分危险,世间谁最勇敢,一位英雄出现-- 学习于该大佬博客 那么你就是这位英雄,不过不同的是,你面对的是一群巨龙,虽然巨龙都不会 ...
- windows上传本地项目Github远程仓库(另附设置git网页链接)
一:关于Windows平台安装git以及github的注册不在详细描述,可以参考如下经验: 安装教程:https://jingyan.baidu.com/article/925f8cb8a8e91cc ...
- js学习笔记之正则
() 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串.(\s*)表示连续空格的字符串.[]是定义匹配的字符范围.比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字 ...
- CSRF+XSRF+SSRF简单介绍
CSRF 使用DVWA靶机,选择low级别,然后更改密码 伪造网页连接 http://localhost:8083/DVWA-master/vulnerabilities/csrf/?password ...
- 点云上的深度学习及其在三维场景理解中的应用(PPT内容整理PointNet)
这篇博客主要是整理了PointNet提出者祁芮中台介绍PointNet.PointNet++.Frustum PointNets的PPT内容,内容包括如何将点云进行深度学习,如何设计新型的网络架构 ...
- 大数据学习(17)—— HBase表设计
为啥要把表设计拿出来独立成章?因为我觉得像我这样搞了很多年Java后端开发的技术人员,在学习HBase的时候,会受到关系型数据库3NF.BCNF的影响.事实上,数据库范式在HBase里完全没用,必须转 ...
- 洛谷P1879题解
题面 显然是个状压DP. 看数据范围,不难发现算法复杂度应该是 \(O(n\times 2^n \times 2^n)\) . 显然第一个 \(n\) 是遍历每一行的土地. 后面两个 \(2^n\) ...
- 【PTA|Python】浙大版《Python 程序设计》题目集:第二章
前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...
- Java ParallelStream
ParallelStream 处理数据 Stream 接口提供了parallelStream方法来将集合转换为并行流.即将一个集合分为多个数据块,并用不同的线程分别处理每个数据块的流. 并且使用par ...