春季启动中的初始化和计划

时间:2020-03-12 01:12:09

标签: java spring spring-boot oop design-patterns

嗨,我读了这段代码:


@Configuration
@Singleton
public class myConfig {
    private static final org.apache.logging.log4j.Logger LOGGER = LogManager.getLogger(myConfig.class);


    public OfflineAttributesComputer offlineAttributesComputer;

    @PostConstruct
    public void init() {
        offlineAttributesComputer = getOfflineAttributesComputer();
    }

    public OfflineAttributesComputer getOfflineAttributesComputer(){
        OfflineAttributesComputer computer = new OfflineAttributesComputer();
        LOGGER.info("Successfully initialized offline computer.");
        return computer;
    }

    @Scheduled(fixedRate = 600000)
    public void updateOfflineAttributesComputer(){
        try {
            offlineAttributesComputer = getOfflineAttributesComputer();
            LOGGER.info("Successfully updated offline computer.");
        } catch (Exception e) {
            throw new EventBrokerException("Failed.", e);
        }
    }
}

基本功能类似于初始化单例对象,并在初始化后为 offlineAttributesComputer 分配一些值。然后每十分钟更新一次变量。

我有些不明白的地方:

  1. @Singleton 是否必要?如果我们将其删除会怎样?

  2. 在类中的
  3. 定义了 public OfflineAttributesComputer offlineAttributesComputer ? 我们应该使用公共静态OfflineAttributesComputer offlineAttributesComputer吗?

  4. 我们为什么需要 @PostConstruct ,我们能以常规方式初始化并安排更新吗?

1 个答案:

答案 0 :(得分:1)

  1. @Singleton是否必要?如果我们删除它会发生什么?

嗯,这不是Spring注释。我相信不需要,因为Singleton是默认范围,请参见此处:Scope of @Configuration Class in spring

  1. 在类中定义了public OfflineAttributesComputer offlineAttributesComputer?我们应该使用public static OfflineAttributesComputer offlineAttributesComputer吗?

否,不需要static。您正在将纯Java的单例设计模式实现与Spring方法混合在一起。

  1. 为什么我们需要@PostConstruct,我们能以常规方式初始化并安排更新时间吗?

从您发布的代码中不需要它,我的意思是也可以用getter完成,但是OfflineAttributesComputer不是bean。作者可能不希望其他人能够在其他课程中自动接线...