Spring boot系列6 - 外部配置

什么是外部配置

一个项目往往有很多属性需要配置,例如日志信息、数据库连接信息、web容器监听端口号、缓存服务器等,外部配置是指把这些配置信息和java代码隔离开,放到单独的地方去,例如放到配置文件、命令行参数、环境变量等。配置的目的就是通过指定不同的属性值从而改变程序的行为。属性值主要是通过键值对的方式指定的,键表示属性的名称,值代表属性对应的值,键往往用某种分层的方式表示,比如用.分隔。例如:

server.port=8080

外部配置的优点

相对于把配置放到Java代码中,外部配置有很多的优点,包括:

  • 修改配置后不需要重新编译代码
  • 方便修改 - 相对于修改代码,外部配置更容易修改
  • 控制灵活 - 可以通过多种方式指定属性值,例如环境变量、命令行、属性文件等。
  • 适应多环境部署 - 不同环境的配置可以集中在各自的配置文件中,只需要通过命令行等方式指定环境名称便可以把项目部署到多个环境中,而不需要修改项目。

spring boot中外部配置的方式和属性加载优先级

spring boot支持多种外部配置的方式,包括:

  • 属性文件(properties文件)
  • YAML文件
  • 环境变量
  • 命令行参数

既然可以用多种方式指定外部配置,spring boot便会从多个地方读取这些配置,如果这些配置之间相互冲突该怎么办呢,为了解决这个问题,spring boot定义了读取配置的优先级,当同一属性出现在多个地方时,最高优先级的将胜出。优先级从高到低为:

  1. 当devtools被激活时,用户目录$HOME/.config/spring-boot下的Devtools全局配置属性,可以通过文件spring-boot-devtools.properties或spring-boot-devtools.yaml或spring-boot-devtools.yml指定。
  2. 测试代码中的由@TestPropertySource注解指定的属性。
  3. 测试中的properties属性,主要是通过测试相关的注解指定,例如@SpringBootTest等。
  4. 命令行参数。
  5. 由SPRING_APPLICATION_JSON指定的属性,SPRING_APPLICATION_JSON是内嵌在环境变量或者系统属性中的JSON。
  6. ServletConfig初始化参数。
  7. ServletContext初始化参数。
  8. 来自java:comp/env的JNDI属性。
  9. Java系统属性(System.getProperties())。
  10. 10.操作系统环境变量。
  11. 由RandomValuePropertySource定义的random.*属性。
  12. 项目Jar包之外(jar包所在目录或者jar包所在目录下的config子目录)的profile特定属性,包括application-{profile}.properties或者YAML文件。
  13. Jar包中(classpath下或者classpath中config子目录)的profile特定属性,包括application-{profile}.properties或者YAML文件。
  14. 项目Jar包之外的应用属性,包括application.properties或者YAML文件。
  15. Jar包中的应用属性,包括application.properties或者YAML文件。
  16. 项目中的@Configuration类上面的@PropertySource注解指定的属性。
  17. 默认属性(由SpringApplication.setDefaultProperties指定)。

几个例子(以配置spring.application.name属性为例,hello.jar为spring boot可执行jar包)

命令行方式
java -jar hello.jar --spring.application.name=Hello
Linux系统中通过SPRING_APPLICATION_JSON指定
SPRING_APPLICATION_JSON='{"spring.application.name": "helloJson"}' java -jar hello.jar
Java系统属性方式
java -jar -Dspring.application.name=Hello hello.jar 
Linux环境变量指定
spring_application_name=Hello java -jar hello.jar
Jar包外application.properties指定

在hello.jar所在目录创建application.properties文件,在其中加入下面内容:

spring.application.name=Hello
Jar包外config/application.properties指定

在hello.jar所在目录创建config子目录,然后在config子目录中创建application.properties文件,在其中加入下面内容:

spring.application.name=Hello
Jar包中classpath下的application.properties指定

在项目的application.properties中加入如下内容:

spring.application.name=Hello
Jar包中classpath下的config/application.properties指定

在项目的resources目录下新建config目录,然后config子目录中创建application.properties文件,在其中加入下面内容:

spring.application.name=Hello

访问外部配置的方式

配置的目的就是为了让程序读取它,从而控制程序的行为,因此程序必须以某种方式读取这些配置,spring boot提供了多种方法读取配置信息。

Spring boot自动读取

spring boot定义了大量的可配置属性,如果程序引入了相应的starter依赖,便可以直接修改这些属性值,spring boot会自动读取它们。
这些属性值可以参考spring文档的Application Properties章节。
在这里插入图片描述

@Value

如果我们想读取单个的值,然后把这个值绑定到对象的属性中,可以使用@Value注解,例如:

@Component
public class MyClass {
    @Value("${spring.application.name}")
    private String applicationName;
}

这儿把spring.application.name对应的值绑定到MyClass对象的applicationName属性中,如果属性值的类型和对象属性类型不匹配,spring boot会自动进行类型转换。

@ConfigurationProperties

如果我们想要把多个属性值映射到某一个对象中,可以使用@ConfigurationProperties注解,它会自动把指定前缀的属性映射到被@ConfigurationProperties修饰的类的对象中。例如我们定义一些项目作者的信息如下:

author.name=john
author.email=2232@abc.com
author.age=18

然后我们定义一个类用于接收这些属性:
在这里插入图片描述

这样,spring boot便会自动把我们定义的author相关的属性注入到Author对象中。
如果我们想在其他类中使用Author对象,可以直接注入:
在这里插入图片描述

通过Environment对象访问

配置信息也可以通过Environment对象获取,我们可以直接在类定义中声明一个Environment对象的字段,spring boot会自动注入该对象,然后我们便可以通过调用env.getProperty方法获取属性值。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值