• Springcloud学习笔记48ApplicationRunner、CommandLineRunner接口使用


    1.ApplicationRunner

    springBoot项目启动时,若想在启动之后直接执行某一段代码,就可以用 ApplicationRunner这个接口,并实现接口里面的run(ApplicationArguments args)方法,方法中写上自己的想要的代码逻辑。

    @Component  //此类一定要交给spring管理
    public class ConsumerRunner implements ApplicationRunner{
        @Override
        public void run(ApplicationArgumers args) throws Exception{
            //代码
            System.out.println("需要在springBoot项目启动时执行的代码---");
        }
    }

    若有多个代码段需要执行,可用@Order注解设置执行的顺序。

    @Component  //此类一定要交给spring管理
    @Order(value=1) //首先执行
    public class ConsumerRunnerA implements ApplicationRunner{
        @Override
        public void run(ApplicationArgumers args) throws Exception{
            //代码
            System.out.println("需要在springBoot项目启动时执行的代码1---");
        }
    }
    @Component  //此类一定要交给spring管理
    @Order(value=2) //其次执行
    public class ConsumerRunnerB implements ApplicationRunner{
        @Override
        public void run(ApplicationArgumers args) throws Exception{
            //代码
            System.out.println("需要在springBoot项目启动时执行的代码2---");
        }
    }

    注意:在使用ApplicationRunner或者CommandLineRunner时如果报错或者出现超时的情况会导致整个程序崩溃。

    解决办法

    在使用时另外开一个线程

    @Component
     public class ApplicationRunnerImpl implements ApplicationRunner {
        @Override
        public void run(ApplicationArguments args) throws Exception {
     
            new Thread(()->{
                //是否创建二维码、导入Excel临时存放路径
                File tempFiles = new File(CorsConfig.tempPath);
                if(!tempFiles.exists()){//如果文件夹不存在
                    tempFiles.mkdirs();//创建文件夹
                    System.out.println("创建临时路径:"+tempFiles);
                }else {
                    System.out.println("临时路径:"+tempFiles);
                }
                //唤醒mq
                SpringUtil.getBean(TesSendAndGet.class);
            }).start();
     
        }
    }

    2. CommandLineRunner接口使用

    CommandLineRunner、ApplicationRunner 接口是在容器启动成功后的最后一步回调(类似开机自启动)。

    • 写一个类,实现CommandLineRunner接口,将该类注入到Spring容器中;
    • 可以通过@Order注解(属性指定数字越小表示优先级越高)或者Ordered接口来控制执行顺序。

    例如,我们自定义两个类,实现CommandLineRunner接口,实现run方法,在run方法中添加处理逻辑。

    package com.ttbank.flep.core.listener;
    
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    /**
     * @Author lucky
     * @Date 2022/7/7 16:47
     */
    @Order(5)
    @Component
    public class AppStartReport implements CommandLineRunner {
        @Override
        public void run(String... args) throws Exception {
            System.out.println("AppStartReport : 项目成功启动------------------");
        }
    }
    package com.ttbank.flep.core.listener;
    
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    /**
     * @Author lucky
     * @Date 2022/7/7 16:53
     */
    @Order(2)
    @Component
    public class AppStartReport2 implements CommandLineRunner {
        @Override
        public void run(String... args) throws Exception {
            System.out.println("AppStartReport2 : 项目成功启动------------------");
        }
    
    }

    代码测试:

     参考文献:

    https://blog.csdn.net/weixin_41667076/article/details/121701303

    https://blog.csdn.net/m0_60215634/article/details/122457170

  • 相关阅读:
    [精华] Linux内存:内存管理的实质
    阿里巴巴笔试题
    LINUX内核经典面试题(转)
    常见网络编程面试题答案征集与面试题(收集)
    转使用jQuery Ajax的内存回收
    模式识别与机器学习
    vc2010 学习笔记2
    vc2010 学习笔记3
    Android高级编程(笔记)第6章 数据存储、检索和共享—3SQLite数据库
    Android高级编程(笔记)第6章 数据存储、检索和共享1共享Preference
  • 原文地址:https://www.cnblogs.com/luckyplj/p/16455353.html
Copyright © 2020-2023  润新知