Springboot啟動執行特定代碼的方式匯總

實現InitializingBean接口或使用@PostConstruct註解

實現InitializingBean如下

public class AnotherExampleBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() {
        // 做一些初始化的工作
    }
}

官方對其的解釋是這樣的:實現這個接口會讓這個bean的所有必要的屬性都被容器註入後(依賴註入),再去執行afterPropertiesSet()裡的方法。

筆者再用一個簡單的例子去實際演示一下(註意:使用@PostConstruct和實現接口是等價的,可以二選一

我們在init方法上使用瞭@PostConstruct註解,並且方法裡使用到瞭Chicken類,而這個Chicken類是通過依賴註入來設置的,所以印證瞭官方說的話,會在依賴註入完以後才會調用@PostConstruct註解的方法。那為什麼不在構造器裡往List裡面方Chicken類呢,因為容器調用構造器方法的時候,Chicken類還沒被註入,所以要寫在@PostConstruct註解的方法裡。

// 首先聲明一個實體類
@Data 
public class Chicken {
    private String name ;
}
// 將他註入容器
@Configuration
public class UserConfig {
    @Bean
    public Chicken putUser(){
        Chicken chinken = new Chicken();
        chinken.setName("普通雞塊");
        return chinken;
    }
}
// 在family 類中調用 註入chinken
@Component
public class Family {
    @Resource
    Chicken chicken;

    public static List<String> names;

    @PostConstruct
    public void init(){
        names.add(chicken.getName());
    }
    public Family() {
        names = new LinkedList<>();
    }
}

在這裡插入圖片描述

實現ApplicationListener接口

如果一個容器裡的bean實現瞭ApplicationListener接口,那麼在任何時候,如果有ApplicationEvent(事件)在ApplicationContext(容器)中被發佈,該bean會收到通知,從而可以執行相應策略。

下面是Spring提供的幾種常用的ApplicationEvent事件

事件名稱 解釋
ContextRefreshedEvent 當容器ApplicationContext容器正在初始化或refreshed時會發佈這個事件。這裡的初始化意味著所有的bean都被加載,並且有後置處理的bean都被檢測到並激活瞭。
ContextStartedEvent 當容器啟動調用start()方法是會發佈這個事件,這裡的開始是所有生命周期的bean都收到瞭一個開始的信號
ContextStoppedEvent 當容器調用stop方法時會發佈這個事件

舉一個簡單的例子,下面的代碼我實現ApplicationListener接口並監聽ContextRefreshedEvent事件,所以當springboot啟動並且初始化完成後,就能執行下面的方法瞭。

@Component
@Slf4j
public class MenuManage implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
       //做一些事情
    }
}

實現CommandLineRunner或ApplicationRunner 接口

實現瞭CommandLineRunner的bean會被springboot監測到,並在項目啟動後執行run方法,如果有多個bean實現瞭CommandLineRunner接口,那麼可以使用order註解來指定執行順序。

@Order(2)
@Component
public class ServerStartedReport implements CommandLineRunner{
    @Override
    public void run(String... args) throws Exception {
        //do something
    }
}

而實現ApplicationRunner接口與實現CommandLineRunner的唯一不同是,後者接收的參數是main方法傳進去的原始參數,而ApplicationRunner接收的參數是封裝過原始參數的,可以通過參數名字name來獲取指定的參數。

@Component
public class MyApplicationRunner implements ApplicationRunner{

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner:"+ Arrays.asList(args.getSourceArgs()));
        System.out.println("getOptionNames:"+args.getOptionNames());
        System.out.println("getOptionValues:"+args.getOptionValues("foo"));
        System.out.println("getOptionValues:"+args.getOptionValues("log"));
    }
}

到此這篇關於Springboot啟動執行特定代碼的幾種方式的文章就介紹到這瞭,更多相關Springboot啟動執行代碼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: