最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解SpringBoot中CommandLineRunner接口

 更新時(shí)間:2023年10月31日 10:41:49   作者:fking86  
Spring Boot的CommandLineRunner接口是一個(gè)函數(shù)式接口,用于在Spring Boot應(yīng)用程序啟動(dòng)后執(zhí)行一些初始化操作,它提供了一個(gè)run方法,該方法在應(yīng)用程序啟動(dòng)后被調(diào)用,本文給大家詳細(xì)介紹了SpringBoot中CommandLineRunner接口,需要的朋友可以參考下

前言

Spring Boot的CommandLineRunner接口是一個(gè)函數(shù)式接口,用于在Spring Boot應(yīng)用程序啟動(dòng)后執(zhí)行一些初始化操作。它提供了一個(gè)run方法,該方法在應(yīng)用程序啟動(dòng)后被調(diào)用。

使用CommandLineRunner接口,可以在應(yīng)用程序啟動(dòng)后執(zhí)行一些必要的初始化操作,例如加載配置文件、初始化數(shù)據(jù)庫(kù)連接、創(chuàng)建默認(rèn)數(shù)據(jù)等??梢酝ㄟ^(guò)實(shí)現(xiàn)CommandLineRunner接口,并重寫(xiě)run方法來(lái)定義自己的初始化邏輯。

實(shí)例

導(dǎo)入庫(kù)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.0</version>
</parent>

<groupId>org.example</groupId>
<artifactId>springboot-CommandLineRunner</artifactId>
<version>1.0-SNAPSHOT</version>

<name>Spring Boot banner</name>
<description>Spring Boot and commandLineRunner</description>

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

application.yaml

server:
  port: 8080

spring:
  profiles:
    active: dev

Runner

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class Runner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        log.info("The Runner start to initialize ...");
    }
}

SpringBootCommandLineRunnerApplication

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@Slf4j
public class SpringBootCommandLineRunnerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootCommandLineRunnerApplication.class, args);
        log.info("The service to end");
    }
}

執(zhí)行結(jié)果

image-20231030003209704

在上面的示例中,我們創(chuàng)建了一個(gè)名為MyCommandLineRunner的類,并實(shí)現(xiàn)了CommandLineRunner接口。在run方法中,我們可以編寫(xiě)需要在應(yīng)用程序啟動(dòng)后執(zhí)行的初始化邏輯。

需要注意的是,實(shí)現(xiàn)CommandLineRunner接口的類需要被Spring容器掃描到,可以使用@Component注解或其他方式將其注冊(cè)為Spring Bean。

先后順序示例

可以通過(guò)@Order()來(lái)設(shè)置Runner的先后順序,在上面例子的基礎(chǔ)上增加

OrderRunner1

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1)
@Slf4j
public class OrderRunner1 implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        log.info("The OrderRunner1 start to initialize ...");
    }
}

OrderRunner2

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(2)
@Slf4j
public class OrderRunner2 implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        log.info("The OrderRunner2 start to initialize ...");
    }
}

執(zhí)行結(jié)果

image-20231030003553969

通常用法

image-20231030004258880

加載初始化數(shù)據(jù)

可以實(shí)現(xiàn)CommandLineRunner接口,在run方法中加載一些初始化數(shù)據(jù)到數(shù)據(jù)庫(kù)等。適合做一些數(shù)據(jù)預(yù)加載工作。

示例

@Component
public class DataInitializer implements CommandLineRunner {

    @Autowired
    private UserRepository userRepository;

    @Override
    public void run(String... args) throws Exception {
        
        // 創(chuàng)建初始用戶
        User admin = new User("admin", "123456");
        userRepository.save(admin);

        User normalUser = new User("user", "123456");
        userRepository.save(normalUser);
        
        System.out.println("數(shù)據(jù)加載完畢!");
    }
}

這里創(chuàng)建了一個(gè) DataInitializer 類,實(shí)現(xiàn) CommandLineRunner 接口。在 run() 方法中,我們注入了 UserRepository,然后創(chuàng)建了兩個(gè)用戶對(duì)象保存到數(shù)據(jù)庫(kù)中。這個(gè)類會(huì)在 Spring Boot 應(yīng)用啟動(dòng)完成后執(zhí)行,從而實(shí)現(xiàn)了數(shù)據(jù)預(yù)加載的效果。通過(guò) CommandLineRunner,我們可以靈活地在 Spring Boot 啟動(dòng)時(shí)進(jìn)行一些初始化操作,如預(yù)先加載測(cè)試數(shù)據(jù)、插入管理員賬戶等,很好地增強(qiáng)了應(yīng)用的功能。

假設(shè)我們有一個(gè)User模型和用戶Repository,需要在Spring Boot啟動(dòng)時(shí)預(yù)加載幾個(gè)用戶數(shù)據(jù),可以這樣使用CommandLineRunner:

@Component
public class DataInitializer implements CommandLineRunner {

    @Autowired
    private UserRepository userRepository;

    @Override
    public void run(String... args) throws Exception {
        
        // 清除所有數(shù)據(jù)
        userRepository.deleteAll(); 
        
        // 創(chuàng)建幾個(gè)用戶
        User user1 = new User("John", "john@example.com");
        User user2 = new User("Mary", "mary@example.com");
        
        userRepository.save(user1);
        userRepository.save(user2);
        
        // 打印已保存用戶數(shù)
        System.out.println("Number of users saved: " + userRepository.count());
    }

}

這里我們實(shí)現(xiàn)了CommandLineRunner接口,然后注入U(xiǎn)serRepository bean。在run方法中,首先清空所有數(shù)據(jù),然后創(chuàng)建兩個(gè)用戶對(duì)象并保存,最后打印已保存的用戶數(shù)。這樣在Spring Boot應(yīng)用啟動(dòng)完成后,就會(huì)自動(dòng)執(zhí)行run方法,預(yù)加載指定的用戶數(shù)據(jù)。

啟動(dòng)后打印應(yīng)用信息

可以打印出一些應(yīng)用啟動(dòng)信息,如啟動(dòng)端口、運(yùn)行環(huán)境信息等,用于確認(rèn)應(yīng)用配置。

示例

@Component
@Slf4j
public class AppInfoPrinter implements CommandLineRunner {

    @Autowired
    private Environment environment;
    @Override
    public void run(String... args) throws Exception {

        log.info("========= 打印啟動(dòng)信息 =========");
        // 打印應(yīng)用端口
        log.info(("端口號(hào): " + environment.getProperty("server.port")));
        // 打印當(dāng)前環(huán)境
        log.info("當(dāng)前環(huán)境: " + environment.getProperty("spring.profiles.active"));
        // 打印JDK版本
        log.info("JDK 版本: " + System.getProperty("java.version"));
        log.info("========= 打印啟動(dòng)信息結(jié)束 =========");

    }

}

執(zhí)行打印結(jié)果

image-20231030011038160

啟動(dòng)異步任務(wù)

可以使用多線程啟動(dòng)一些異步任務(wù),進(jìn)行后臺(tái)數(shù)據(jù)處理等復(fù)雜業(yè)務(wù)邏輯。

示例

@Component
@Slf4j
public class AsyncTaskRunner implements CommandLineRunner {

    @Autowired
    private AsyncTaskService asyncTaskService;

    @Override
    public void run(String... args) throws Exception {
        log.info("========= 執(zhí)行任務(wù) =========");
        // 在新線程中執(zhí)行任務(wù)
        new Thread(() -> {
            asyncTaskService.doTaskOne();
            asyncTaskService.doTaskTwo();
            asyncTaskService.doTaskThree();
        }).start();
    }

}

@Service
@Slf4j
class AsyncTaskService {

    public void doTaskOne() {
        log.info("執(zhí)行任務(wù)1");
    }

    public void doTaskTwo() {
        log.info("執(zhí)行任務(wù)2");
    }

    public void doTaskThree() {
        log.info("執(zhí)行任務(wù)3");
    }
}

執(zhí)行結(jié)果

[           main] org.example.runner.AsyncTaskRunner       : ========= 執(zhí)行任務(wù) =========
[       Thread-1] org.example.runner.AsyncTaskService      : 執(zhí)行任務(wù)1
[       Thread-1] org.example.runner.AsyncTaskService      : 執(zhí)行任務(wù)2
[       Thread-1] org.example.runner.AsyncTaskService      : 執(zhí)行任務(wù)3

接口健康檢查

可以調(diào)用并驗(yàn)證依賴服務(wù)的健康狀態(tài),如果不正??梢越K止Spring Boot啟動(dòng)。

示例

@Component
@Slf4j
public class HealthCheckRunner implements CommandLineRunner {

    @Autowired
    private DatabaseService databaseService;

    @Autowired
    private MessageQueueService messageQueueService;

    @Override
    public void run(String... args) throws Exception {

        if(!databaseService.isConnected()) {
            log.error("數(shù)據(jù)庫(kù)服務(wù)不可用,退出應(yīng)用!");
            System.exit(1);
        }

        if(!messageQueueService.isConnected()) {
            log.error("消息隊(duì)列服務(wù)不可用,退出應(yīng)用!");
            System.exit(1);
        }

        log.info("所有服務(wù)正常,應(yīng)用啟動(dòng)。");

    }
}

這里我們注入兩個(gè)依賴服務(wù) DatabaseService 和 MessageQueueService。在run方法中,調(diào)用它們的健康檢查方法,如果任何一個(gè)服務(wù)不可用,則直接調(diào)用System.exit(1)退出Spring Boot應(yīng)用啟動(dòng)。

外部服務(wù)調(diào)用

可以在啟動(dòng)時(shí)調(diào)用外部服務(wù),進(jìn)行驗(yàn)證、數(shù)據(jù)同步等操作。

示例

@Component
public class OtherServiceCheckRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 健康檢查的URL
        String healthCheckUrl = "http://localhost:8080/actuator/health";

        RestTemplate restTemplate = new RestTemplate();
        // 發(fā)送GET請(qǐng)求進(jìn)行健康檢查
        String response = restTemplate.getForObject(healthCheckUrl, String.class);

        // 根據(jù)響應(yīng)判斷健康狀態(tài)
        if (response.contains("\"status\":\"UP\"")) {
            System.out.println("Application is healthy");
        } else {
            System.out.println("Application is not healthy");
        }
    }
}

參數(shù)校驗(yàn)

可以對(duì)輸入的運(yùn)行參數(shù)做校驗(yàn),如果不滿足條件可以終止Spring Boot啟動(dòng)。

示例

@Component
@Slf4j
public class ParameterValidator implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 校驗(yàn)參數(shù)1
        if(args.length < 2) {
            log.error("參數(shù)不正確,請(qǐng)傳入至少2個(gè)參數(shù)!");
            System.exit(1);
        }

        // 校驗(yàn)參數(shù)2是否為數(shù)字
        if(!args[1].matches("\\d+")) {
            log.error("第二個(gè)參數(shù)必須是數(shù)字!");
            System.exit(1);
        }

        // 校驗(yàn)通過(guò),應(yīng)用繼續(xù)啟動(dòng)
        log.info("參數(shù)校驗(yàn)通過(guò),應(yīng)用啟動(dòng)中...");
    }
}

在run方法中,我們可以對(duì)main方法輸入的參數(shù)args進(jìn)行自定義校驗(yàn):

檢查參數(shù)數(shù)量校驗(yàn)參數(shù)類型

如果參數(shù)不滿足需求,可以直接調(diào)用System.exit(1)來(lái)終止Spring Boot的啟動(dòng)。這樣就可以在應(yīng)用啟動(dòng)前驗(yàn)證參數(shù)的正確性,避免應(yīng)用啟動(dòng)后發(fā)生未知錯(cuò)誤。

動(dòng)態(tài)設(shè)置配置

可以根據(jù)運(yùn)行參數(shù)等條件動(dòng)態(tài)設(shè)置Spring Boot的配置,實(shí)現(xiàn)不同環(huán)境的適配。

示例 application.yaml

myconfig:
  foo: 十五
  bar: 1

MyConfig

@Component
@Data
@ConfigurationProperties(prefix = "myconfig")
public class MyConfig {
    private String foo;
    private int bar;

// getter和setter方法省略

    @Override
    public String toString() {
        return "MyConfig{" +
                "foo='" + foo + '\'' +
                ", bar=" + bar +
                '}';
    }
}

ConfigRunner

@Component
@EnableConfigurationProperties(MyConfig.class)
public class ConfigRunner implements CommandLineRunner {

    @Autowired
    private MyConfig myConfig;

    @Override
    public void run(String... args) throws Exception {
// 打印當(dāng)前配置
        System.out.println("Current config: " + myConfig);

// 動(dòng)態(tài)設(shè)置配置
        myConfig.setFoo("new value");
        myConfig.setBar(100);

// 打印更新后的配置
        System.out.println("Updated config: " + myConfig);
    }
}

啟動(dòng)阻塞

可以使應(yīng)用啟動(dòng)后阻塞住主線程,防止main方法直接退出,從而保持Spring Boot應(yīng)用運(yùn)行。

示例

@Component
@Slf4j
public class StartBlocker implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 加載提示信息
        log.info("正在等待管理員授權(quán)...");

        // 等待授權(quán),阻塞啟動(dòng)流程
        waitAuth();

        // 授權(quán)完成后繼續(xù)啟動(dòng)
        log.info("管理員已授權(quán),應(yīng)用啟動(dòng)中...");
    }

    private void waitAuth() {
        // 死循環(huán)模擬等待管理員操作授權(quán)
        while(true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                break;
            }
        }
    }

}

總結(jié)

通過(guò) CommandLineRunner,我們可以深度控制 Spring Boot 應(yīng)用的啟動(dòng)流程,在應(yīng)用啟動(dòng)階段增強(qiáng)各種自定義邏輯。是 Spring Boot 提供的一個(gè)很實(shí)用的擴(kuò)展點(diǎn)。

以上就是一文詳解SpringBoot中CommandLineRunner接口的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot CommandLineRunner接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Spring DeferredResult異步操作使用場(chǎng)景

    詳解Spring DeferredResult異步操作使用場(chǎng)景

    本文主要介紹了Spring DeferredResult異步操作使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Intellij IDEA Debug調(diào)試技巧(小結(jié))

    Intellij IDEA Debug調(diào)試技巧(小結(jié))

    這篇文章主要介紹了Intellij IDEA Debug調(diào)試技巧(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 使用spring.profiles.active來(lái)分區(qū)配置的方法示例

    使用spring.profiles.active來(lái)分區(qū)配置的方法示例

    這篇文章主要介紹了使用spring.profiles.active來(lái)分區(qū)配置的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • SpringBoot登錄認(rèn)證前后端實(shí)現(xiàn)方案:SpringBoot + Mybatis + JWT(圖文實(shí)例)

    SpringBoot登錄認(rèn)證前后端實(shí)現(xiàn)方案:SpringBoot + Mybatis +&

    本文展示如何在Spring生態(tài)系統(tǒng)中整合IOC/DI、MyBatis、MD5加密、Session/Cookie管理、JWT令牌和攔截器,以實(shí)現(xiàn)一個(gè)企業(yè)級(jí)的認(rèn)證方案,前端使用HTML/CSS/JavaScript/JQuery,后端使用SpringBoot+MyBatis+JWT,通過(guò)統(tǒng)一返回結(jié)果封裝和圖形驗(yàn)證碼,提高了API的可維護(hù)性和安全性
    2025-10-10
  • Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法詳解

    Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法詳解

    Java 8 已經(jīng)發(fā)布很久了,很多報(bào)道表明Java 8 是一次重大的版本升級(jí)。下面這篇文章主要給大家介紹了關(guān)于Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • springboot項(xiàng)目啟動(dòng)類錯(cuò)誤(找不到或無(wú)法加載主類 com.**Application)

    springboot項(xiàng)目啟動(dòng)類錯(cuò)誤(找不到或無(wú)法加載主類 com.**Application)

    本文主要介紹了spring-boot項(xiàng)目啟動(dòng)類錯(cuò)誤(找不到或無(wú)法加載主類 com.**Application),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • SpringBoot整合AOP及使用案例實(shí)戰(zhàn)

    SpringBoot整合AOP及使用案例實(shí)戰(zhàn)

    本文詳細(xì)介紹了Spring AOP中的切入點(diǎn)表達(dá)式,重點(diǎn)講解了execution表達(dá)式的語(yǔ)法和用法,通過(guò)案例實(shí)戰(zhàn),展示了AOP的基本使用、結(jié)合自定義注解以及環(huán)繞通知的實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解

    圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解

    這篇文章主要介紹了圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    Java中String、StringBuffer、StringBuilder的區(qū)別詳解

    java中String、StringBuffer、StringBuilder是編程中經(jīng)常使用的字符串類,他們之間有什么區(qū)別呢?下面小編給大家總結(jié)了Java中String、StringBuffer、StringBuilder的區(qū)別詳解,需要的朋友參考下吧
    2016-06-06
  • 詳解Mybatis是如何解析配置文件的

    詳解Mybatis是如何解析配置文件的

    這篇文章主要介紹了詳解Mybatis是如何解析配置文件的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論

正阳县| 长春市| 阿拉尔市| 石景山区| 紫金县| 韶关市| 永年县| 武强县| 阿鲁科尔沁旗| 施甸县| 宁都县| 中阳县| 宝山区| 阜阳市| 阿拉善左旗| 海口市| 合江县| 安岳县| 铜鼓县| 辽源市| 台湾省| 桃江县| 扶余县| 黔江区| 扎兰屯市| 平利县| 南宁市| 宁夏| 龙井市| 双流县| 博爱县| 波密县| 彰武县| 新建县| 静安区| 清远市| 茂名市| 昌吉市| 改则县| 毕节市| 鄂尔多斯市|