有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想用Lombok生成器为下面的类设置一个默认的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();
    }
}

我试图实现的是用当前时钟自动设置创建时间戳。时钟有一个用于测试的静态值。 我怎样才能做到这一点


共 (1) 个答案

  1. # 1 楼答案

    如果您需要在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类的构造函数