变量的Spring Boot公约

Ric*_*ard 10 java spring spring-mvc javabeans spring-boot

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

spring:
  url: localhost
email:
  from: something@gmail.com
app:
  uuid: 3848348j34jk2dne9
Run Code Online (Sandbox Code Playgroud)

我想将这些配置属性连接到我的应用程序中的不同组件,如下所示:

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

以上工作正如我的申请中所述.但我的问题是,这是否是春季靴子的最佳实践.我所知道的另一个替代方法是Properties通过在配置类中创建bean 来使用对象,使用所有配置变量加载属性并将属性bean自动装配到组件中.

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

Mag*_*nus 17

正如您已经确定注入配置的两个主要选择是使用@Value单个属性或@ConfigurationPropertiesjavabean配置对象.

您使用哪一个归结为偏好.我个人更喜欢使用配置对象.

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

以下是使用弹簧配置时我建议的一些做法.

  • @ConfigurationProperties为应用程序的逻辑组件创建单个对象.尽量保持模块化,避免为整个应用程序配置创建转储基础.

  • 不要@Value在多个位置使用相同的属性.
    如果应用程序中的多个位置需要相同的配置,那么您应该将值移动到配置对象中.
    使用多个相同属性的@Value注释就更难理性各地,而且还可能会导致意外的行为,如果你在一个地方"规划环境地政司"的表达方式,而不是其他定义的默认值.

  • 不要在spring命名空间中定义自己的属性.
    例如,您的spring.url属性不是文档中定义的属性之一.
    通过使用相同的名称空间,您将面临在将来的spring-boot版本中使用该名称的风险.