变量的Spring Boot公约

时间:2017-08-30 23:43:02

标签: java spring spring-mvc spring-boot javabeans

所以我的弹簧启动应用程序有一个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
    }
}

上述内容适用于我的应用程序。但我的问题是,这是否是春季靴子的最佳实践。我所知道的另一个替代方法是通过在配置类中创建bean来使用Properties对象,使用所有配置变量加载属性并将属性bean自动装配到组件中。

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

1 个答案:

答案 0 :(得分:17)

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

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

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

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

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

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

  • 不要在spring命名空间中定义自己的属性 例如,您的spring.url属性is not one of the properties defined in the documentation 通过使用相同的名称空间,您将面临在将来的spring-boot版本中使用该名称的风险。