如何在Spring Boot服务中解决太多@Value

时间:2019-04-23 13:28:05

标签: spring-boot

我建立了Spring Boot服务,并拥有BookService以及将近15个不同的@Value字段。它们都是常量,可以在其他地方共享给应用程序。其中一些与Amazon访问有关,另一些与Redis键有关。

是否有任何方法可以减少application.properties中消耗的值量?有这样的事情是正常的行业惯例吗?我可以使用其他方法吗?

BookService.java代码段:

@Service
public class BookService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Value("${redis.orders.timestampKey}")
    private String redisOrdersTimestampKey;

    @Value("${redis.orders.retrunsKey}")
    private String redisOrdersReturnsKey;

    @Value("${redis.orders.quantityKey}")
    private String redisOrdersQuantityKey;

    ...
}

我主要担心的是,我建立的设计与业界最佳实践相去甚远,并且将来可能很难实现。

2 个答案:

答案 0 :(得分:3)

只需使用某种弹簧的ConfigurationPropertiesHere您可以找到更多。

这应该对您有用:

@ConfigurationProperties(prefix = "redis")
public class RedisProperties {

    @NestedConfigurationProperty
    private Order orders;

    // ..getters and setters


    public static class Order{

        private String timestampKey;
        private String retrunsKey;
        private String quantityKey;

        // ..getters and setters
    }
}

然后将此依赖项添加到您的pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

并创建如下配置:

@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class SomeConfiguration {
}

然后,您可以像使用标准Spring bean一样使用RedisProperties并将其注入所需的位置。

答案 1 :(得分:2)

查看文档:{​​{3}}

您将创建一个属性类,并在您的服务中将其自动连接。您还可以验证您的属性。您的班级可能如下所示(注意:这是Lombok的一部分):

@Configuration
@ConfigurationProperties(prefix = "redis.orders")
@NoArgsConstructor
@Getter
@Setter
public class RedisOrderProperties {

    @NotEmpty
    private String redisOrdersTimestampKey;

    @NotEmpty
    private String redisOrdersReturnsKey;

    @NotEmpty
    private String redisOrdersQuantityKey;

}

按如下所示在您的服务中对其进行自动布线(注意:构造函数注入应优先于字段注入):

@Service
public class BookService {

    private final RedisOrderProperties redisOrderProperties;
    private final StringRedisTemplate redisTemplate;


    @Autowired
    public BookService(RedisOrderProperties redisOrderProperties, StringRedisTemplate redisTemplate) {
        this.redisOrderProperties = redisOrderProperties;
        this.redisTemplate = redisTemplate;
    }
}