Springboot啟動執(zhí)行特定代碼的方式匯總
實現(xiàn)InitializingBean接口或使用@PostConstruct注解
實現(xiàn)InitializingBean如下
public class AnotherExampleBean implements InitializingBean { @Override public void afterPropertiesSet() { // 做一些初始化的工作 } }
官方對其的解釋是這樣的:實現(xiàn)這個接口會讓這個bean的所有必要的屬性都被容器注入后(依賴注入),再去執(zhí)行afterPropertiesSet()里的方法。
筆者再用一個簡單的例子去實際演示一下(注意:使用@PostConstruct和實現(xiàn)接口是等價的,可以二選一)
我們在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<>(); } }
實現(xiàn)ApplicationListener接口
如果一個容器里的bean實現(xiàn)了ApplicationListener接口,那么在任何時候,如果有ApplicationEvent(事件)在ApplicationContext(容器)中被發(fā)布,該bean會收到通知,從而可以執(zhí)行相應策略。
下面是Spring提供的幾種常用的ApplicationEvent事件
事件名稱 | 解釋 |
---|---|
ContextRefreshedEvent | 當容器ApplicationContext容器正在初始化或refreshed時會發(fā)布這個事件。這里的初始化意味著所有的bean都被加載,并且有后置處理的bean都被檢測到并激活了。 |
ContextStartedEvent | 當容器啟動調用start()方法是會發(fā)布這個事件,這里的開始是所有生命周期的bean都收到了一個開始的信號 |
ContextStoppedEvent | 當容器調用stop方法時會發(fā)布這個事件 |
舉一個簡單的例子,下面的代碼我實現(xiàn)ApplicationListener接口并監(jiān)聽ContextRefreshedEvent事件,所以當springboot啟動并且初始化完成后,就能執(zhí)行下面的方法了。
@Component @Slf4j public class MenuManage implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { //做一些事情 } }
實現(xiàn)CommandLineRunner或ApplicationRunner 接口
實現(xiàn)了CommandLineRunner的bean會被springboot監(jiān)測到,并在項目啟動后執(zhí)行run方法,如果有多個bean實現(xiàn)了CommandLineRunner接口,那么可以使用order注解來指定執(zhí)行順序。
@Order(2) @Component public class ServerStartedReport implements CommandLineRunner{ @Override public void run(String... args) throws Exception { //do something } }
而實現(xiàn)ApplicationRunner接口與實現(xiàn)CommandLineRunner的唯一不同是,后者接收的參數(shù)是main方法傳進去的原始參數(shù),而ApplicationRunner接收的參數(shù)是封裝過原始參數(shù)的,可以通過參數(shù)名字name來獲取指定的參數(shù)。
@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啟動執(zhí)行特定代碼的幾種方式的文章就介紹到這了,更多相關Springboot啟動執(zhí)行代碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot實現(xiàn)敏感字段加密存儲解密顯示功能
這篇文章主要介紹了springboot實現(xiàn)敏感字段加密存儲,解密顯示,通過mybatis,自定義注解+AOP切面,Base64加解密方式實現(xiàn)功能,本文通過代碼實現(xiàn)給大家介紹的非常詳細,需要的朋友可以參考下2022-02-02Java 實戰(zhàn)項目之在線點餐系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)在線點餐系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11mybatis如何通過接口查找對應的mapper.xml及方法執(zhí)行詳解
這篇文章主要給大家介紹了利用mybatis如何通過接口查找對應的mapper.xml及方法執(zhí)行的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。2017-06-06使用java + selenium + OpenCV破解騰訊防水墻滑動驗證碼功能
這篇文章主要介紹了使用java + selenium + OpenCV破解騰訊防水墻滑動驗證碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11