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的加载顺序:

学习了luzle在CSDN中的博文


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文件的全部了解

### 回答1: Spring Boot 是一个基于 Spring 框架的开发工具,它使用注解和约定优于配置的原则来简化 Spring 应用的开发。在 Spring Boot ,将应用程序的配置信息存储在 application.yml 文件,以便进行统一的管理。 Spring Boot 是通过使用@ConfigurationProperties注解来加载 application.yml 文件的。首先,我们需要在应用程序的配置类上添加该注解,并使用 @PropertySource 指定要加载的配置文件的位置。然后,通过在属性上使用相应的注解(如 @Value、@ConfigurationProperties)来将属性与配置文件的值进行绑定。 在加载配置文件时,Spring Boot 将自动根据属性的名称从 application.yml 文件查找对应的值,并将其注入到应用程序。 除了 application.yml 文件,Spring Boot 还支持加载其他格式的配置文件,如 application.properties。可以根据具体的需求选择适合的配置文件格式。 通过将应用程序的配置信息集保存在 application.yml 文件,可以方便地管理和修改配置。而且,Spring Boot 还提供了一些内置的功能和注解,可以方便地对配置进行校验和自动完成。 总之,Spring Boot 通过@ConfigurationProperties注解和相关的注解来加载 application.yml 文件,将应用程序的配置信息集管理,简化了开发过程。它提供了方便的配置方式,使得配置的修改和管理更加灵活和高效。 ### 回答2: Spring Boot 是一个基于 Spring 框架的开源Java开发框架,通过自动化配置和约定式编程,大大简化了传统 Spring 应用的开发过程。 在 Spring Boot application.yml 是用来存放应用的配置信息的文件。Spring Boot 在启动时会自动加载 application.yml 文件,并读取其的配置信息,然后根据这些配置信息来完成相应的配置操作。 为了加载 application.yml 文件,Spring Boot 遵循了一定的加载顺序。首先,它会在 classpath 下找到所有的 application.yml 文件,然后按照一定的优先级进行加载。具体加载顺序如下: 1. 当前项目的 classpath 下的根路径(即 src/main/resources/)下的 application.yml。 2. 当前项目的 classpath 下的 config 目录下的 application.yml。 3. 当前项目 jar 包外部的 config 目录下的 application.yml。 4. 当前项目 jar 包内部的 config 目录下的 application.yml。 在加载这些 application.yml 文件时,Spring Boot 会根据默认的配置规则进行解析。通常,我们可以在 application.yml 使用一些特定的前缀来标识不同的配置项,比如 spring、server 等,这样 Spring Boot 就会根据这些前缀来将配置的值绑定到相应的对象。这个过程称为自动配置。 除了 application.yml,Spring Boot 还支持其他的配置文件格式,如 application.propertiesapplication.yaml 等。它们的加载方式和 application.yml 类似,只是文件格式不同而已。 总之,Spring Boot 可以通过加载 application.yml 来读取应用的配置信息,并根据这些配置信息完成对应的配置操作,从而简化了开发过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值