springboot实现系统启动任务

springboot实现系统启动任务

1.什么是系统启动任务

系统启动任务就是当项目启动的时候能够执行的东西就是系统启动任务,即随着项目启动而执行的。如果是ssm项目一般可以通过自定义listener监听器实现,监听servletContext的启动然后做一些初始化的操作;springboot中也可以这么做,但是也有自己的方案即CommandLineRunnerApplicationRunner来实现。

2.CommandLineRunner实现系统启动任务

首先自定一个类实现CommandLineRunner接口,然后重写里面的run方法,这个run方法里面的参数就是启动类main方法上的参数,默认是为空的。
下面demo中有两个类都是实现了CommandLineRunner接口,存在多个系统启动任务时就有一个优先级的问题,可以使用@Order注解指定优先级,数字越小优先级越大。

package com.cls.commandlinerunner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author by CLS
 * @Classname MyCommandLineRunner
 * @Description TODO
 * @Date 2021/5/15/0015 9:06:46
 */
@Component
@Order(100)
public class MyCommandLineRunner implements CommandLineRunner {
    /**
     * 当系统启动时,run方法会被触发,方法参数就是main方法所传入的参数
     * 如果存在多个系统启动任务的话,必然存在一个优先级的问题,可以使用@Order注解
     * 指定优先级,数字越小优先级越大
     * @param args 这个参数就是系统启动类上的args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        //默认打印出来是空的
        System.out.println("args = " + Arrays.toString(args));
    }
}
package com.cls.commandlinerunner;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author by CLS
 * @Classname MyCommandLineRunner
 * @Description TODO
 * @Date 2021/5/15/0015 9:06:46
 */
@Component
@Order(90)
public class MyCommandLineRunner2 implements CommandLineRunner {
    /**
     * 当系统启动时,run方法会被触发,方法参数就是main方法所传入的参数
     * @param args 这个参数就是系统启动类上的args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        System.out.println("args2 = " + Arrays.toString(args));
    }
}

结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9XiNl42-1621068976424)(en-resource://database/1049:1)]

  • 默认的参数都问空,怎么指定参数呢?
    1.在idea中指定参数:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LyhekZ3Q-1621068976426)(en-resource://database/1051:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hoFRiv4X-1621068976426)(en-resource://database/1053:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t3pgjASs-1621068976427)(en-resource://database/1055:1)]

2.项目打包之后指定参数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZBEKBUiX-1621068976428)(en-resource://database/1057:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V0PupsLP-1621068976429)(en-resource://database/1059:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJvNHyln-1621068976430)(en-resource://database/1061:1)]

3.ApplicationRunner实现系统启动任务

package com.cls.commandlinerunner;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

/**
 * @author by CLS
 * @Classname MyApplicationRunner
 * @Description TODO
 * @Date 2021/5/15/0015 9:30:07
 */
@Component
@Order(70)
public class MyApplicationRunner2 implements ApplicationRunner {
    /**
     *
     * @param args
     * @throws Exception
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        //获取没有键的参数,获取到的值和 commandlinerunner 一致
        List<String> nonOptionArgs = args.getNonOptionArgs();
        System.out.println("nonOptionArgs2 = " + nonOptionArgs);

        //获取所有的键
        Set<String> optionNames = args.getOptionNames();
        System.out.println("optionNames = " + optionNames);
        for (String optionName : optionNames) {
            System.out.println("optionName2: " + optionName +"---"+ args.getOptionValues(optionName));
        }

        //获取命令行中的所有参数,不管有没有键的
        String[] sourceArgs = args.getSourceArgs();
        System.out.println("sourceArgs2 = " + Arrays.toString(sourceArgs));
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7aK7JlZR-1621068976430)(en-resource://database/1063:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tUZgR4lk-1621068976430)(en-resource://database/1065:1)]

  • 总结:ApplicationRunnerCommandLineRunner这两个实现系统启动任务都差不多,只是run方法的参数不同,以及获取参数值的方式不同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值