博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot中的application.properties外部注入覆盖
阅读量:2290 次
发布时间:2019-05-09

本文共 6005 字,大约阅读时间需要 20 分钟。

由想要忽略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=mzywucaitest.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=voiceserver.video.uri=videoserver.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}# 单个文件大小为20Mspring.servlet.multipart.max-file-size=20MB# 没有多文件上传,也设定为20Mspring.servlet.multipart.max-request-size=20MB# 语音的最大size B -> 10Mvoice.max-size=10485760# 视频的最大size B -> 20Mvideo.max-size=20971520# 图片的最大size B -> 10Mimage.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

参照的博文:

spring boot允许你自定义一个application.properties文件,然后放在以下的地方,来重写spring boot的环境变量或者定义你自己环境变量(优先级同样是先config,再当前,适合在生产环境下部署时使用)

1.当前目录的 “/config”的子目录下

2.当前目录下

以上就是我对注入application.properties,以及SpringBoot中用好properties文件的全部了解

转载地址:http://aybnb.baihongyu.com/

你可能感兴趣的文章
socket
查看>>
判断远程url是否有效的几种方法
查看>>
javascript中编写类似in_array()的原型函数
查看>>
go 数据库操作
查看>>
php读取二进制流
查看>>
Golang热重启
查看>>
热重启golang服务器(graceful restart golang http server)
查看>>
echo框架使用:获取与配置
查看>>
PHP模拟多进程并发将内容写入文件
查看>>
nginx.conf配置说明
查看>>
Eclipse设定和修改文件字符编码格式和换行符
查看>>
git常用操作以及快速入门教程
查看>>
MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片....)
查看>>
在notepad++中 “tab转为空格”、“按tab插入空格”、“文档格式转换”
查看>>
Zend Framework 常用组件概述
查看>>
Zend_Db -> Zend_Db_Adapter
查看>>
Zend_Db -> Zend_Db_Select
查看>>
Zend_Db -> Zend_Db_Table
查看>>
PHP漏洞全解(三)-客户端脚本植入
查看>>
Java学习日记 求最值 排序 选择 冒泡 交换
查看>>