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



我想用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;
}
}

然后在春季配置中使用此时钟实例

@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类的构造函数

最新更新