【问题标题】:How to initialize data sturcture before starting spring application?如何在启动spring应用程序之前初始化数据结构?
【发布时间】:2020-02-03 08:26:26
【问题描述】:

我有一些用于初始化它的数据结构,我需要向数据库发出请求,然后调用将为数据结构准备数据的对象,然后才对其进行初始化。在启动 spring-mvc 应用程序之前我该怎么做?

我正在尝试使用 @PostConstruct 和 @EventListener(ApplicationReadyEvent.class) 之类的注释,但它们是使用 spring 应用程序启动的,此时数据结构尚未初始化。

有代码示例:

public class DataStructure{
    Collection data = new Collection();//some kind of collection



    @PostConstruct
    public void initDS(){
        DataFromDataBase data = ...;
        SomeObjectThatPrepareData obj = new SomeObjectThatPrepareData(data);

        Collection preparedData = obj.prepareData();

        preparedData.forEach(DataStructure::addData);


    }

    private void addData(Data data){ ... }

    ...
}

public class ClassThatUseDataStucture{
     private static DataStructure readyData;
     static{
         readyData = new DataStructure();
         readyData.initDS();
     }

    ...

}

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    如果您想在 Spring Boot 应用程序启动时设置/初始化某些内容,您应该使用 ApplicationRunnerCommandLineRunner

    Spring boot 提供了一个 ApplicationRunner 接口,带有一个回调 run() 方法,可以在 Spring 应用程序上下文实例化后在应用程序启动时调用该方法。

    例如

    @Component
    public class AppStartupRunner implements ApplicationRunner {
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            // Setup or initialization activities
        }
    }
    

    或者您可以按照 Aniket 在 cmets 中的建议创建 Bean:

    @Bean 
    ApplicationRunner thisWillRunAutomatically() 
    {
        return args -> { ... };
    }
    

    在此处阅读有关 Spring 启动回调的更多信息:Spring boot callbacks

    【讨论】:

    • 最好设置一个@Bean ApplicationRunner thisWillRunAutomatically() {return args -> ...}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2017-01-31
    • 2011-01-23
    • 2015-06-05
    • 2018-01-16
    • 2013-07-02
    相关资源
    最近更新 更多