欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot初始化接口CommandLineRunner示例詳解

 更新時間:2023年07月03日 10:28:46   作者:多冷啊、我在東北玩泥巴  
這篇文章主要介紹了SpringBoot初始化接口CommandLineRunner,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

CommandLineRunner的使用

接口定義

Spring官方給出的接口定義

package org.springframework.boot;
@FunctionalInterface
public interface CommandLineRunner {
    void run(String... args) throws Exception;
}

在 Spring Boot 應用程序中,CommandLineRunner 是一個接口,用于定義在應用程序啟動后執(zhí)行的任務。它有一個單獨的方法 run(),在應用程序啟動完成后自動調用。

具體來說,CommandLineRunner 的 run() 方法會在 Spring Boot 應用程序完成啟動過程后立即執(zhí)行。這意味著在 Spring 上下文加載完畢、所有 Bean 實例化完成之后,run() 方法將被調用??梢钥吹剑摻涌谶€是一個函數(shù)式接口,函數(shù)式的方式就不演示了,我們這里繼承該接口實現(xiàn)方法即可

使用

在我們需要進行初始化的類中直接實現(xiàn)該接口的 run()方法即可注意:如果你要run方法能被執(zhí)行,你必須將實現(xiàn)了該接口的類注入到Spring容器中

CommandLineRunner 接口通常用于在應用程序啟動后執(zhí)行一些初始化任務或準備工作,例如加載初始數(shù)據(jù)、設置定時任務、啟動后臺線程等。通過實現(xiàn) CommandLineRunner 接口并覆蓋 run() 方法,你可以將你的任務邏輯放在其中,以便在應用程序啟動時自動執(zhí)行。

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

執(zhí)行結果

可以看到該方法在Application started之后才執(zhí)行

執(zhí)行順序

需要注意的是,如果應用程序中有多個實現(xiàn)了 CommandLineRunner 的類,它們的執(zhí)行順序可能是不確定的。如果你需要確保執(zhí)行順序,可以使用 @Order 注解或實現(xiàn) org.springframework.core.Ordered 接口來指定順序。在 Spring Framework 中,@Order 注解用于指定組件的執(zhí)行順序。它可以應用于類級別或方法級別。

使用 @Order 注解

示例代碼如下所示:

定義兩個類,order分別為1和2

@Component
public class MyComponent1  implements CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent1.class);
    @Order(1)
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent1 -> CommandLineRunner");
    }
}
@Component
public class MyComponent2 implements CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent2.class);
    @Order(2)
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent2 -> CommandLineRunner");
    }
}

運行結果:

對于類級別的 @Order 注解,它指定了組件在 Spring 上下文中的加載順序。具體來說,數(shù)值越小的組件將先被加載和初始化。如果沒有顯式指定 @Order 注解,默認情況下,組件的加載順序是不確定的。

實現(xiàn)Orderd接口

實現(xiàn)org.springframework.core.Ordered 中的getOrder()方法

下面再創(chuàng)建兩個類,并實現(xiàn) org.springframework.core.Ordered 接口。

@Component
public class MyComponent3 implements Ordered, CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent3.class);
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent3 -> CommandLineRunner");
    }
    @Override
    public int getOrder() {
        return 3;
    }
}
@Component
public class MyComponent4 implements Ordered, CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent4.class);
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent4 -> CommandLineRunner");
    }
    @Override
    public int getOrder() {
        return 4;
    }
}

執(zhí)行結果如下:

可以看到無論使用哪種方式都是order值更小的優(yōu)先執(zhí)行,但是實現(xiàn)org.springframework.core.Ordered接口的會比在方法上使用@Order注解的有更高的優(yōu)先級,所有實現(xiàn)org.springframework.core.Ordered接口的類中的run方法會都會優(yōu)先于在方法上使用@Order注解執(zhí)行,無論設置的值是否比注解中的更小

我這里猜測可能是實現(xiàn)接口是類級別的order,所以會優(yōu)先于方法級別的order,所以我又做了下面實驗,將MyComponent1和MyComponent2中的@Order注解挪到類聲明上,所以就變成了下面這樣

@Order(1)
@Component
public class MyComponent1  implements CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent1.class);
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent1 -> CommandLineRunner");
    }
}
@Order(2)
@Component
public class MyComponent2 implements CommandLineRunner {
    Logger logger = LoggerFactory.getLogger(MyComponent2.class);
    @Override
    public void run(String... args) throws Exception {
        logger.info("MyComponent2 -> CommandLineRunner");
    }
}

再次執(zhí)行結果:

果然MyComponent1和MyComponent2排到前面去了,看來猜測沒有錯

排序總結

  • @Order注解在類上會比注解在方法上擁有更高的優(yōu)先級
  • 實現(xiàn)org.springframework.core.Ordered接口的getOrder()方法和@Order注解在類上是相同的優(yōu)先級
  • order值越小越先執(zhí)行
  • order值可以為負數(shù),一樣遵循越小越優(yōu)先的規(guī)則

到此這篇關于SpringBoot初始化接口CommandLineRunner的文章就介紹到這了,更多相關SpringBoot初始化接口CommandLineRunner內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論