zoukankan      html  css  js  c++  java
  • Spring Boot 初始化运行特定方法

    Spring Boot提供了两种 “开机自启动” 的方式,ApplicationRunnerCommandLineRunner

    这两种方式的目的是为了满足,在容器启动时like执行某些方法。我们可以通过实现ApplicationRunner或者CommandLineRunner来实现,他们都是在SpringAppliaction执行之后开始执行的。这个特性可以让我们自定义一些在容器启动时需要初始化的逻辑

    ApplicationRunner接口

    官方doc:

    Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple ApplicationRunner beans can be defined within the same application context and can be ordered using the Ordered

    当该接口包含在SpringApplication中时执行。多个ApplicationRunner通过Order直接进行排序:

    /**
     * 初始化类
     */
    @Order(1) // @Order注解可以改变执行顺序,越小越先执行
    @Component
    public class MyApplicationRunner1 implements ApplicationRunner {
    
        /**
         * 会在服务启动完成后立即执行
         */
        @Override
        public void run(ApplicationArguments arg0) throws Exception {
            System.out.println("MyApplicationRunner1----" + arg0);
        }
    
    }
    /**
     * 初始化类
     */
    @Order(2) 
    @Component
    public class MyApplicationRunner2 implements ApplicationRunner {
    
        /**
         * 会在服务启动完成后立即执行
         */
        @Override
        public void run(ApplicationArguments arg0) throws Exception {
            System.out.println("MyApplicationRunner2----" + arg0);
        }
    
    }

    容器启动后的运行结果:

    可以看到多个ApplicationRunner执行顺序是按照Order中的值执行的,并且每个的入参都是同一个ApplicationArguments实例(具体原因后面分析)

    CommandLineRunner接口

    二者的官方doc基本一样,区别在于接收的参数不一样

    /**
     * 初始化类
     */
    @Order(1) // @Order注解可以改变执行顺序,越小越先执行
    @Component
    public class MyCommandLineRunner1 implements CommandLineRunner {
    
        /**
         * 会在服务启动完成后立即执行
         */
        @Override
        public void run(String... args) throws Exception {
            System.out.println("MyCommandLineRunner1----" + args);
        }
    
    }
    /**
     * 初始化类
     */
    @Order(2)
    @Component
    public class MyCommandLineRunner2 implements CommandLineRunner {
    
        /**
         * 会在服务启动完成后立即执行
         */
        @Override
        public void run(String... args) throws Exception {
            System.out.println("MyCommandLineRunner2----" + args);
        }
    
    }

    容器启动后的运行结果:

    可以看到多个CommandLineRunner的执行效果跟ApplicationRunner一模一样

    最后看下源码:

    SpringApplication启动时,会执行其run方法中的afterRefresh方法:

    在afterRefresh中可以看到这两个接口被执行,并且每个ApplicationRunner或CommandLineRunner实例都是用的同一个入参:

  • 相关阅读:
    Link Maker 为 Apple Music、iTunes Store、App Store、iBooks Store 以及 Mac App Store 创建链接。
    在 CentOS7 上安装 MySQL5.7
    Git关于忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题
    UITableView的frame改变做动画时,如何禁用UITableViewCell内置的动画效果
    Error: You must `brew link pcre openresty-openssl` before homebrew/nginx/openresty can be installed
    resty.upload 处理上传的图片 并把生成的url保存到数据库中
    Lua 计算两个GPS坐标点之间的距离
    Cornerstone安装提示文件已损坏问题
    "xxx was built without full bitcode" 编译错误解决
    iOS 网页打开APP,并且跳转到对应界面
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/10430936.html
Copyright © 2011-2022 走看看