在 Spring Boot 中使用 @Bean 配置设置 class 属性 的默认值

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

我想为以下 class 使用 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 中)使用此时钟配置实例 然后我会这样做: 首先通过static holder pattern

创建一个配置时区的Clock单例
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 中使用这个正确的时钟配置 class

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

这种方法有一些缺点,例如,您不能轻易地将此时钟实例替换为某个固定时钟进行测试,因此您需要更改测试中的 created 字段,例如通过 Foo 的构造函数class