【Spring实战】05 CommandLineRunner

CommandLineRunner 是 Spring Boot 提供的一个接口,用于在 Spring Boot 应用程序启动后执行一些任务。通过实现 CommandLineRunner 接口,我们可以在应用程序启动时执行一些初始化操作,例如加载初始数据、建立连接,或者执行其他的启动任务。

1. 简介

CommandLineRunner 接口定义了一个单一的 run 方法,该方法会在应用程序启动后被调用。可以将多个 CommandLineRunner 实例注册到 Spring Boot 应用程序中,它们会按照注册的顺序依次执行。

源码如下

在这里插入图片描述

2. 用法

1)单个 CommandLineRunner

要实现 CommandLineRunner 接口,只需要实现它的 run 方法。

下面是一个简单的例子:

DemoCommandLineRunner.java

package com.cheney.demo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class DemoCommandLineRunner implements CommandLineRunner {
   
    @Override
    public void run(String... args) throws Exception {
   
        System.out.println("Hello CommandLineRunner");
    }
}

在上述代码中,DemoCommandLineRunner 类实现了 CommandLineRunner 接口,并在 run 方法中编写了打印 Hello CommandLineRunner 的代码。这个任务会在应用程序启动时执行。

启动类

package com.cheney.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(DemoApplication.class, args);
    }
}

执行结果:

在这里插入图片描述

2)多个 CommandLineRunner

可以同时注册多个 CommandLineRunner 实例,并通过 @Order 注解或 Ordered 接口来指定它们的执行顺序。

下面是一个简单的例子:

DemoCommandLineRunner.java

package com.cheney.demo;

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

@Component
@Order(1)
public class DemoCommandLineRunner implements CommandLineRunner {
   
    @Override
    public void run(String... args) throws Exception {
   
        System.out.println("Hello CommandLineRunner");
    }
}

Demo2CommandLineRunner.java

package com.cheney.demo;

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

@Component
@Order(2)
public class Demo2CommandLineRunner implements CommandLineRunner {
   
    @Override
    public void run(String... args) throws Exception {
   
        System.out.println("Hello CommandLineRunner 2");
    }
}

在上述代码中,DemoCommandLineRunnerDemo2CommandLineRunner 分别标注了 @Order(1)@Order(2),指定了它们的执行顺序。如果不使用 @Order 注解,可以实现 Ordered 接口来设置顺序。

执行结果:

在这里插入图片描述

3. 优点

  • 简单方便

    CommandLineRunner 的设计目标是简化应用程序启动时的初始化工作,开发者只需实现 run 方法,将需要在启动时执行的逻辑放在其中即可,非常方便。

  • 与 Spring Boot 协同工作

    CommandLineRunner 是 Spring Boot 提供的标准接口之一,与 Spring Boot 的自动配置和生命周期机制协同工作,确保在应用程序启动时执行初始化任务。

  • 多任务支持

    应用程序可以同时注册多个 CommandLineRunner 实例,通过 @Order 注解或实现 Ordered 接口,可以指定它们的执行顺序,灵活支持多任务的初始化需求。

4. 缺点

  • 仅适用于 Spring Boot

    CommandLineRunner 是 Spring Boot 提供的特定接口,因此仅适用于基于 Spring Boot 的应用程序。如果应用程序不使用 Spring Boot,这种方式可能不够适用。

  • 局限于启动时执行

    CommandLineRunner 主要用于在应用程序启动时执行任务,如果需要其他触发点或更细粒度的控制,可能需要考虑其他方式。

  • 无法传递参数

    CommandLineRunnerrun 方法不接受参数,因此在运行时动态地传递参数可能会有些困难。如果需要更灵活的参数传递方式,可能需要考虑其他方式,如使用配置文件、环境变量等。

总结

CommandLineRunner 接口是 Spring Boot 中用于执行应用程序启动任务的一种方便的方式。通过实现这个接口,我们可以在应用程序启动时执行初始化操作,确保应用程序在启动后处于正确的状态。

相关推荐

  1. <span style='color:red;'>Spring</span><span style='color:red;'>05</span>

    Spring05

    2023-12-28 21:20:02      43 阅读
  2. CommandLineRunner接口和@PostConstruct

    2023-12-28 21:20:02       46 阅读
  3. CommandLineRunner解释学习

    2023-12-28 21:20:02       33 阅读
  4. 09 string实现

    2023-12-28 21:20:02       35 阅读
  5. <span style='color:red;'>Spring</span><span style='color:red;'>03</span>

    Spring03

    2023-12-28 21:20:02      42 阅读
  6. <span style='color:red;'>Spring</span><span style='color:red;'>04</span>

    Spring04

    2023-12-28 21:20:02      43 阅读
  7. <span style='color:red;'>Spring</span>-<span style='color:red;'>01</span>

    Spring-01

    2023-12-28 21:20:02      24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 21:20:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 21:20:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 21:20:02       82 阅读
  4. Python语言-面向对象

    2023-12-28 21:20:02       91 阅读

热门阅读

  1. 三路归并排序可视化

    2023-12-28 21:20:02       55 阅读
  2. 算法训练营Day29(回溯)

    2023-12-28 21:20:02       61 阅读
  3. 阿里控股 面经

    2023-12-28 21:20:02       60 阅读
  4. 快速排序回顾及相关题型

    2023-12-28 21:20:02       60 阅读
  5. 72 DFS解决目标和问题

    2023-12-28 21:20:02       51 阅读
  6. 进程

    进程

    2023-12-28 21:20:02      50 阅读
  7. nginx部署前端项目总结

    2023-12-28 21:20:02       67 阅读
  8. C++_静态成员变量介绍

    2023-12-28 21:20:02       51 阅读
  9. MOS和三极管

    2023-12-28 21:20:02       56 阅读
  10. Go语言并发编程:Goroutines和Channels的详细指南

    2023-12-28 21:20:02       66 阅读
  11. 应对微信小程序用户流失率的有效策略

    2023-12-28 21:20:02       55 阅读
  12. js 事件处理(addEventListener() 、removeEventListener())

    2023-12-28 21:20:02       55 阅读
  13. 浅谈Linux的OOM Killer机制

    2023-12-28 21:20:02       57 阅读
  14. nginx配置后不生效的问题

    2023-12-28 21:20:02       55 阅读