Spring 变量的引导约定

Spring Boot Convention for Variables

所以我的 spring 启动应用程序有一个 application.yml 文件,如下所示:

spring:
  url: localhost
email:
  from: something@gmail.com
app:
  uuid: 3848348j34jk2dne9

我想像这样将这些配置属性连接到我的应用程序中的不同组件中:

@Component
public class FooA {
    private final String url;

    public FooA(@Value("${spring.url}") String url) {
        this.url = url
    }
}

@Component
public class FooB {
    private final String from;

    public FooA(@Value("${email.from}") String from) {
        this.from = from
    }
}

@Component
public class FooC {
    private final String uuid;

    public FooA(@Value("${app.uuid}") String uuid) {
        this.uuid = uuid
    }
}

以上在我的应用程序中按预期工作。但我的问题是这是否是 spring 引导中的最佳实践。据我所知,唯一的其他替代方法是通过在配置 class 中创建一个 bean 来使用 Properties 对象,使用所有配置变量加载属性并自动装配 属性 bean 到组件中。

这种情况下的最佳做法是什么?

正如您所确定的,注入配置的两个主要选择是对单个属性使用 @Value 或对 javabean 配置对象使用 @ConfigurationProperties

您使用哪个取决于偏好。我个人更喜欢使用配置对象。

使用 @ConfigurationProperties 允许您使用 JSR-303 bean 验证。
如果需要,您还可以在 javabean 的 setter 中编写自己的自定义验证。
您可以从非 spring 项目注释配置 bean,这允许您编写易于配置但不依赖于 spring.
的库 您可以从对象中生成 IDE 元数据,使您的开发过程更加顺畅。

以下是我在使用 spring 配置时推荐的一些做法。

  • 为应用程序的逻辑组件创建单独的 @ConfigurationProperties 对象。尽量保持模块化,避免为整个应用程序配置创建垃圾场。

  • 不要在多个位置使用相同的 @Value 属性。
    如果您的应用程序中的多个位置需要相同的配置,那么您可能应该将该值移动到配置对象中。
    在多个 @Value 注释中使用相同的 属性 会使推理变得更加困难,并且如果您在一个地方通过 "SpEL" 表达式定义默认值并且也可能导致意外行为不是另一个。

  • 不要在 spring 名称中定义自己的属性space。
    例如你的 spring.url 属性 is not one of the properties defined in the documentation.
    通过使用相同的名称 space,您 运行 有可能在未来的 spring-boot 版本中使用该名称。