Spring Boot-在应用程序启动期间/之前运行代码的正确方法?

时间:2019-03-29 21:06:47

标签: java spring spring-boot spring-mvc

对于在启动时在Spring Boot Web应用程序中实现逻辑似乎有不同的意见。但是在“最佳实践”或相对于其他方法的首选方式上尚无共识。

我有以下代码在启动时实现ApplicationRunner接口(带有一些虚拟输出):

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class AppStartupRunner implements ApplicationRunner {

    public static int counter;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("Application started with option names : {}",
                args.getOptionNames());
        log.info("Increment counter");
        counter++;
    }
}

这种方法是否被认为是“适当的”(因为缺乏更好的用语)?我的意图是运行一些代码以在数据库启动时获取值,使用Ehcache将其存储在其中,以及其他一些“初始化”位。

这似乎是 hack ,因此不确定是否有更清洁或更合适的方法来解决此问题。

1 个答案:

答案 0 :(得分:1)

ApplicationRunnerCommandLineRunner是实现用于执行业务逻辑的正确接口,这些业务逻辑在启动时需要注入依赖性。 两者之间没有太大区别。

CommandLineRunner将使您可以访问在启动时传递的原始String参数数组。
ApplicationRunner将为您提供更结构化的ApplicationArguments,仅此而已。

您可以有多个创业者,甚至可以订购它们。


  

这似乎有点黑

不,不是。 ApplicationRunnerCommandLineRunner JavaDoc

  

接口,用于指示当包含bean时应运行   在SpringApplication中。