SpringBoot外化配置源码解析:综合实战演示参数及配置

综合实战本章我们讲解了关于 Spring Boot 外化配置的原理及源码分析 , 本节我们通过一个具体的例子来简单演示在 Spring Boot 中如何使用不同类型的参数及配置 。 本节实例涉及的部分新知识点我们也会进行简单介绍和拓展 。
在本节实例中 , 我们会用到命令行传递参数、默认配置文件 application.properties 及基于profile 配置参数、@Value 注解获取参数、 基于类型安全的@ConfigurationProperties 注解关联 Bean 等功能 。
由于 Spring Boot 已经对外化配置进行了简化处理 , 对照此前章节中相关原理的介绍 , 我们在实践中使用起来是非常方便的 。 这里我创建了一个标准的 Spring Boot 项目 , 版本采用2.2.1.RELEASE 。 首先我们看一下项目的目录结构 。
SpringBoot外化配置源码解析:综合实战演示参数及配置文章插图
在 pom.xml 中引入的核心依赖为 spring-boot-starter-web,对应依赖源码如下 。
org. springframework . bootspring- boot- starter-webSpringbootConfigApplication 类为 Spring Boot 项目的启动类 , 我们不再做过多介绍 。
ConfigController类为接收请求的 Controller, 在 其内部定义了 一 个 默 认 的getConfigParams 方法 , 在该方法内打印了不同途径获得的参数值 , 相关源码如下 。
@RestControllerpublic class ConfigController {@Value( "${user . username}")private String username ;@Value("${user . password}")private String password;@Resourceprivate LoginUserConfig loginUserConfig;@Value("${projectName :unknown}")private String projectName ;@RequestMapping("/")public String getConfigParams() {//启动命令传递参数System. out . println("Command config projectName:" + projectName);//通过 appl ication 配置文件配置的参数System. out . println("Application config UsernameSystem. out . println("Application config Password :”+ password);//通过@ConfigurationProperties 注解配置的参数System. out. println("ConfigurationProperties config Username :”+ loginUserConfig.getUsername());System . out . println("Configurat ionProperties config Password :”+ loginUserConfig.getPassword());return "";}其中通过@RestController 注解指定该类为可接收请求的 Controller,并进行实例化 。 在该类内部分 别通过@Value 注解、@Resource 注解来 获取不同途径 设置的参数 。通过getConfigParams 方法对外提供访问请求 ,当前接收到请求之后会打印不同途径获得参数的值 。
首先我们来看通过@Value 获取到的值的来源 , 在该实例中有两个途径来设置对应的值:
application.properties 配置文件和命令行参数 。
关于命令行参数 , 我们之前也已经提到过 , 基本传递方式就是在执行启动项目的命令时通过“一 name=value' 的形式进行传递 。 结合并实例 , 传递方式如下 。
【SpringBoot外化配置源码解析:综合实战演示参数及配置】java -jar springboot-config-0. 0.1- SNAPSHOT. jar -- projectName=SpringBoot在 ConfigController 类中 , 我们可以看到@Value 的使用基本格式为@Value("${param}") , 但针对命令行参数获取时我们采用了@Value("${param:default}")方式 。 在实践中这两种方式都比较常用 , 而第二种通过冒号分隔符进行传递默认值 , 当 param 参数不存在或未在application 中配置时 , 会使用指定的默认值 。
以当前实例为例 , 如果启动命令中未指定 projectName 参数 , 同时@Value 获取时也未指定默认值"unknown" , 那么在执行启动命令时便会抛出异常无法启动 。 这是我们在使用@Value的过程中需要注意的一种情况 。
关于 application.properties 配置文件中参数的设置更简单 , 直接在对应文件中设置对应的key=value 值即可 , 比如本例中 application.properties 中的配置源码如下 。
#公共配置 , 任何环境启动均采用 8080 端server. port=8080spring. profiles . active=dev但在实践的过程中 , 我们经常会遇到不同环境需要不同配置文件的情况 , 如果每换一-个环境就重新修改配置文件或重新打包一次会比较麻烦 , 这时就可以用 Spring Boot 提供的Profile 配置功能来解决问题了 。 而我们实例中提供的 3 个 properties 配置文件就是为了展示 Profile 配置的基本使用 。
通常情况下 , 项目中根据环境的多少会创建 1 个到多个 properties 配置文件 , 一般情况下它们对应的命名格式和相关功能如下 。

  1. *applcation.properties:公共配置 。
  2. *application-dev.properties:开发环境配置 。
  3. .application-test.properties:测试环境配置 。
  4. application-prod.properties:生产环境配置 。
当然 , 命名中的“dev'"test 和"prod”是可以自定义的 , 而这些配置在什么时候会被使用 , 则可通过激活 application.properties 配置文件中的 spring.profiles. active 参数来控制 。