zoukankan      html  css  js  c++  java
  • 使用CommandLineRunner进行项目启动之后预加载数据

    在项目中有时需要在项目启动之后进行预加载数据(例如配置在数据中的常量数据),这是可以使用spring boot 提供的CommandLineRunner接口

    新建类实现CommandLineRunner接口,同时使用 @Component 注解

    @Component
    @Order(1)
    public class ConstantPreloading implements CommandLineRunner{
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ConstantPreloading.class);
        
        @Override
        public void run(String... args) throws Exception {
            LOGGER.info("=========预加载一些常量信息==========");
        }
        
    }

    1、如果项目中需要多个预加载的动作,可以新建多个类并且实现CommandLineRunner接口,spring boot会自动扫描实现了CommandLineRunner接口的bean并依次执行。

    2、如果多个runner需要按优先级执行,这是可以使用@Order 注解,通过源码查看,order的值越小优先级越高(源码处排序方法 AnnotationAwareOrderComparator.sort(runners))。

    runner是由org.springframework.boot.SpringApplication.callRunners(ApplicationContext, ApplicationArguments) 执行的,部分代码如下

    private void callRunners(ApplicationContext context, ApplicationArguments args) {
            List<Object> runners = new ArrayList<>();
            runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
            runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
            AnnotationAwareOrderComparator.sort(runners);
            for (Object runner : new LinkedHashSet<>(runners)) {
                if (runner instanceof ApplicationRunner) {
                    callRunner((ApplicationRunner) runner, args);
                }
                if (runner instanceof CommandLineRunner) {
                    callRunner((CommandLineRunner) runner, args);
                }
            }
        }
  • 相关阅读:
    面试题 31: 求子数组的最大和
    [面试] 结构体占用空间的问题,内存对齐~! 真的懂了,cpu取加快速度,省空间来考虑。
    [计算机] 32768~32767 计算机中的 1 表示
    C#跨线程调用窗体控件
    合并字节数组
    将汉字转化为2位大写的16进制Unicode
    关公与子龙两大杀手
    早年的J2EE笔记
    给小组新成员的一份信
    c++虚函数详解
  • 原文地址:https://www.cnblogs.com/xiaoweiv/p/11237683.html
Copyright © 2011-2022 走看看