簡體   English   中英

在 Spring Boot 中使用 @Bean 配置設置類屬性的默認值

[英]Set default value of class property with @Bean configuration in Spring Boot

我想使用 Lombok Builder 為以下類設置默認的 LocalDateTime。 它的值應該來自@Bean 配置。

    @Data
    public class Foo {
        @Builder.Default
        LocalDateTime created = LocalDateTime.now(clock);
    }

這里是時鍾配置。 該值應在對象初始化時設置:

@Configuration
public class TimeConfig {
    public final static String TIME_ZONE = "UTC";

    @Bean
    public Clock clock() {
        TimeZone.setDefault(TimeZone.getTimeZone(TIME_ZONE));
        return Clock.systemUTC();
    }
}

我想要實現的是使用當前時鍾自動設置創建時間戳。 時鍾具有用於測試的靜態值。 我怎樣才能使這項工作?

如果您需要在 spring 上下文和外部(在 lombok 中)使用此時鍾配置實例,那么我將這樣做:首先通過靜態持有者模式創建一個具有配置時區的時鍾單例

public class ClockInstance {
    public final static String TIME_ZONE = "UTC";
    static {
        TimeZone.setDefault(TimeZone.getTimeZone(TIME_ZONE));
    }

    public Clock getClock(){
        return Clock.systemUTC();
    }

    private ClockInstance() {
    }

    private static class Holder {
        private static final ClockInstance INSTANCE = new ClockInstance();
    }

    public static ClockInstance getInstance() {
        return Holder.INSTANCE;
    }
}

然后在你的 spring 配置中使用這個時鍾實例

@Configuration
public class TimeConfig {

    @Bean
    public Clock clock() {
        return ClockInstance.getInstance().getClock();
    }
}

你將能夠在你的 Foo 類中使用這個正確的時鍾配置

@Data
public class Foo {
    @Builder.Default
    LocalDateTime created = LocalDateTime.now(ClockInstance.getInstance().getClock());
}

這種方法有一些缺點,例如你不能輕易地將這個用於測試的時鍾實例替換為某個固定時鍾,因此你需要在測試中更改created字段,例如通過 Foo 類的構造函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM