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

Sir*_*its 6 java spring spring-mvc spring-boot

对于启动时在 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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法是否被认为是“正确的”(因为缺乏更好的术语)?我的目的是运行一些代码来在启动时从数据库获取值,使用 Ehcache 和其他一些“初始化”位将它们存储在其中。

这看起来很黑客,所以不确定是否有更干净或更合适的方法来解决这个问题。

Lpp*_*Edd 3

ApplicationRunnerCommandLineRunner是执行需要在启动时注入依赖项的业务逻辑的正确接口。两者之间没有太大区别。

CommandLineRunner 将使您能够访问String启动时传递的原始参数数组。
ApplicationRunner会给你一个更加结构化的ApplicationArguments,但仅此而已。

您可以拥有多个初创跑步者,甚至可以订购它们。


这看起来很黑客

不,这不对。ApplicationRunnerCommandLineRunnerJavaDoc

用于指示 bean 包含在SpringApplication.