在 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
我想为以下 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