首頁 > 軟體

Springboot啟動後立即某個執行方法的四種方式

2022-06-02 18:01:19

最新需要在專案啟動後立即執行某個方法,然後特此記錄下找到的四種方式

註解@PostConstruct

使用註解@PostConstruct是最常見的一種方式,存在的問題是如果執行的方法耗時過長,會導致專案在方法執行期間無法提供服務。

@Component
public class StartInit {
//
//    @Autowired   可以注入bean
//    ISysUserService userService;

    @PostConstruct
    public void init() throws InterruptedException {
        Thread.sleep(10*1000);//這裡如果方法執行過長會導致專案一直無法提供服務
        System.out.println(123456);
    }
}

CommandLineRunner介面

實現CommandLineRunner介面 然後在run方法裡面呼叫需要呼叫的方法即可,好處是方法執行時,專案已經初始化完畢,是可以正常提供服務的。

同時該方法也可以接受引數,可以根據專案啟動時: java -jar demo.jar arg1 arg2 arg3 傳入的引數進行一些處理。詳見: Spring boot CommandLineRunner啟動任務傳參

@Component
public class CommandLineRunnerImpl implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println(Arrays.toString(args));
    }
}

實現ApplicationRunner介面

實現ApplicationRunner介面和實現CommandLineRunner介面基本是一樣的。

唯一的不同是啟動時傳參的格式,CommandLineRunner對於引數格式沒有任何限制,ApplicationRunner介面引數格式必須是:–key=value

@Component
public class ApplicationRunnerImpl implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Set<String> optionNames = args.getOptionNames();
        for (String optionName : optionNames) {
            List<String> values = args.getOptionValues(optionName);
            System.out.println(values.toString());
        }
    }
}

實現ApplicationListener

實現介面ApplicationListener方式和實現ApplicationRunner,CommandLineRunner介面都不影響服務,都可以正常提供服務,注意監聽的事件,通常是ApplicationStartedEvent 或者ApplicationReadyEvent,其他的事件可能無法注入bean。

@Component
public class ApplicationListenerImpl implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("listener");
    }
}

四種方式的執行順序

註解方式@PostConstruct 始終最先執行

如果監聽的是ApplicationStartedEvent 事件,則一定會在CommandLineRunner和ApplicationRunner 之前執行。

如果監聽的是ApplicationReadyEvent 事件,則一定會在CommandLineRunner和ApplicationRunner 之後執行。

CommandLineRunner和ApplicationRunner 預設是ApplicationRunner先執行,如果雙方指定了@Order 則按照@Order的大小順序執行,大的先執行。

總結

到此這篇關於Springboot啟動後立即某個執行方法的四種方式的文章就介紹到這了,更多相關Springboot啟動後執行方法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com