springBoot 自定义 属性解析 springboot自定义配置类_优先级


传统的 Spring 配置的就如同买菜做饭,开发者完全掌控 Spring 配置的内容,可是显式声明应用程序里全部的 Bean 并不是明智之举,就如同不是所有人都是做饭大厨一样。

Spring Boot 自动配置就像是从冰箱里取出速冻食品,让 Spring Boot 处理各种细节比自己声明上下文里全部的 Bean 要容易很多,就如同可以完全放心速冻食品至少不会难吃一样。

更加幸运的是,Spring Boot 自动配置非常灵活,它允许用户参与影响自动配置的实施,就像速冻饺子可以随大家的口味蘸醋或者辣椒一样。

下面介绍多种影响自动配置的方式。


显式配置

Spring Boot 会发现开发者编写的显式配置,随后降低自动配置的优先级,以自定义配置为准。

实现方式是 @ConditionalOnMissingBean,这个注解判断如果不存在某类则注入本类,表现形式就是如果不存在自定义类则注入自动配置类。当然了,并不是每次都要做到这种程度,也可以通过设置几个简单的配置属性调整自动配置组件。


属性精细化配置

为了微调一些细节,比如改端口号和日志级别,便放弃自动配置是一件让人羞愧的事。

实际上,Spring Boot 能从多种属性源获得属性,获取方式按照优先级排序,在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。如下所示,

  1. 命令行参数
  2. java:comp/env 里的 JNDI 属性
  3. JVM 系统属性
  4. 操作系统环境变量
  5. 随机生成的带 random.* 前缀的属性(在设置其他属性时,可以引用它们,比如 ${random. long})
  6. 应用程序以外的 application.properties 或者 appliaction.yml 文件
  7. 打包在应用程序内的 application.properties 或者 appliaction.yml 文件
  8. 通过 @PropertySource 标注的属性源
  9. 默认属性

application.properties 和 application.yml 文件能放在以下四个位置,

  1. 外置,在相对于应用程序运行目录的 /config 子目录里。
  2. 外置,在应用程序运行的目录里。
  3. 内置,在 config 包内。
  4. 内置,在 Classpath 根目录。

同样,这个列表按照优先级排序。也就是说,/config 子目录里的 application.properties 会覆盖应用程序 Classpath 里的 application.properties 中的相同属性。

如果同一优先级位置同时有 application.properties 和 application.yml,那么 application. yml 里的属性会覆盖 application.properties 里的属性。


Profile 配置

当应用程序需要部署到不同的运行环境时,一些配置细节通常会有所不同。比如,数据库连 接的细节在开发环境下和测试环境下就会不一样,在生产环境下又不一样。

Spring Framework 从 Spring 3.1 开始支持基于 Profile 的配置。Profile 是一种条件化配置,基于运行时激活的 Profile,会使用或者忽略不同的 Bean 或配置类。如下面用的@Profile 注解要求运行时激活 production Profile,这样才能应用该配置,


@Profile("production")


幸运的是,Spring Boot 支持为 application.properties 和 application.yml 里的属性配置 Profile。在这里只介绍 application.yml 这种的 YAML 配置的格式,

  • 创建 application- {profile}.yml 文件,与 Profile 无关的属性继续放在 application.yml里。
  • 将 application.yml 文件使用 --- 分为三个段。 每段为 spring.profiles 指定了一个值,这个值表示该部分配置应用在哪个 Profile 里。