springboot 項(xiàng)目容器啟動后如何自動執(zhí)行指定方法
springboot 項(xiàng)目容器啟動后自動執(zhí)行指定
我們需要寫一個(gè)class去讓它實(shí)現(xiàn)ApplicationRunner,然后重寫它的run方法就行了,注意類加上@Component注解
注意:這個(gè)class需要寫在和Application啟動類的同級目錄或者子級目錄下,否則不生效。
代碼:
package com.qq.weixin; import lombok.extern.slf4j.Slf4j; import org.joda.time.DateTime; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; /** * @author XuYangWei * @Date 2021/1/22 8:56 */ @Slf4j @Component public class TestRuner implements ApplicationRunner { @Override public void run(ApplicationArguments applicationArguments) throws Exception { log.info("我是Spring容器啟動后立即執(zhí)行的方法,當(dāng)前時(shí)間:"+ DateTime.now().toString("yyyy-MM-dd HH:mm:ss")); } }
springboot 容器及啟動過程
SpringBoot會啟動兩個(gè)容器,即父子容器
- 父容器(Spring容器):AnnotationConfigWebApplicationContex
- 子容器(SpringMVC容器):AnnotationConfigEmbeddedWebApplicationContex
思考幾個(gè)問題:
問題1:為什么要啟動父子兩個(gè)容器?
在Spring整體框架的核心概念中,容器是核心思想,而在一個(gè)項(xiàng)目中,容器不一定只有一個(gè),Spring中可以包括多個(gè)容器,使用上下層關(guān)系來管理容器可以解決公共屬性抽取的問題,即將公共的屬性放到父容器中,對其各個(gè)子容器均可見,實(shí)現(xiàn)了復(fù)用功能,注意子容器對父容器是不可見的。
問題2:在什么時(shí)候啟動父容器?
準(zhǔn)備環(huán)境變量,即執(zhí)行prepareEnvironment方法時(shí),發(fā)布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener監(jiān)聽器收到該事件,會初始化父容器
問題3:父容器和子容器的區(qū)別?
1.子容器中會創(chuàng)建植入的tomcat容器類,用來管理tomcat服務(wù),父容器沒有
2.父容器管理的bean集合是spring框架內(nèi)置的一些bean,子容器管理的bean集合是我們業(yè)務(wù)定義的bean以及spring框架內(nèi)置的bean
問題4:怎么保證父容器啟動過程中
執(zhí)行prepareEnvironment方法時(shí),BootstrapApplicationListener監(jiān)聽器不再重復(fù)執(zhí)行?
父容器初始化完成后,會在webEnvironment屬性中加入bootstrap屬性標(biāo)識,這樣就可以根據(jù)該標(biāo)識來判斷是否需要執(zhí)行了
問題5:容器實(shí)際通過什么來管理bean
容器通過beanFactory來管理對象,父子容器都會各持有一個(gè)DefaultListableBeanFactory,即父子容器都會管理各自的bean。
子容器啟動流程:
1.執(zhí)行初始化:初始化webEnvironment以及l(fā)isteners
2.發(fā)布容器啟動事件
3.在執(zhí)行prepareEnvironment步驟時(shí),發(fā)布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener監(jiān)聽器收到該事件,會再次調(diào)用SpringApplication
- 初始化和run方法(初始化父容器的步驟類似子容器)
4.創(chuàng)建context,通過判斷webEnvironment標(biāo)識,這時(shí)為true,創(chuàng)建AnnotationConfigEmbeddedWebApplicationContext實(shí)例
5.執(zhí)行refreshContext,比較核心的方法,詳細(xì)說一下:
- 獲取bean工廠,即創(chuàng)建DefaultListableBeanFactory實(shí)例
- 為bean工廠賦一些基礎(chǔ)屬性,主要有類加載器
- 為bean工廠注冊WebApplicationContextServletContextAwareProcessor,一個(gè)BeanPostProcessor,主要用于獲取ServletContext
- 執(zhí)行beanFactoryPostProcessor,遞歸處理,主要用于掃描@CompontScan、@Import、@ImportSource等注解的類,首先注冊bean元數(shù)據(jù)到工廠,然后可以修改bean工廠
- 實(shí)例化BeanPostProcessor類并注冊到bean工廠單例列表中
- 實(shí)例化消息通知類并注冊到bean工廠單例列表中
- 調(diào)用onRefresh方法,初始化一個(gè)植入的tomcat容器
- 注冊監(jiān)聽器到消息通知器中,區(qū)分為兩類:一、從系統(tǒng)配置中加載的監(jiān)聽器(已實(shí)例化) 二、已注冊但還未實(shí)例化的監(jiān)聽器
- 實(shí)例化注冊表中的所有bean,創(chuàng)建bean的過程中會執(zhí)行bean的初始化操作,會執(zhí)行BeanPostProcessor、afterPropertiesSet、初始化方法等等
- 調(diào)用finishRefresh,啟動所有bean,發(fā)布ContextRefreshed事件
6.執(zhí)行afterRefresh,調(diào)用實(shí)現(xiàn)了ApplicationRunner/CommandLineRunner接口的bean run方法
7.發(fā)布ApplicationReadyEvent事件
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot啟動時(shí)自動執(zhí)行指定方法的幾種實(shí)現(xiàn)方式
- IntelliJ IDEA下SpringBoot如何指定某一個(gè)配置文件啟動項(xiàng)目
- springBoot?啟動指定配置文件環(huán)境多種方案(最新推薦)
- IDEA下SpringBoot指定環(huán)境、配置文件啟動操作過程
- SpringBoot啟動時(shí)加載指定方法的方式小結(jié)
- SpringBoot啟動時(shí)如何通過啟動參數(shù)指定logback的位置
- springboot指定profiles啟動失敗問題及解決
- springboot項(xiàng)目啟動指定對應(yīng)環(huán)境的方法
- SpringBoot項(xiàng)目啟動時(shí)執(zhí)行指定的方法
相關(guān)文章
Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法
這篇文章主要介紹了Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法,在研發(fā)過程中我們需要與其他系統(tǒng)對接的場景,連接SQLServer拉取數(shù)據(jù),所以就用jdbc連接數(shù)據(jù)庫的方式連接外部數(shù)據(jù)源,需要的朋友可以參考下2021-10-10Java數(shù)據(jù)結(jié)構(gòu)之List的使用總結(jié)
List是Java中比較常用的集合類,指一系列存儲數(shù)據(jù)的接口和類,可以解決復(fù)雜的數(shù)據(jù)存儲問題,本文就來拿實(shí)際案例總結(jié)介紹一下List的使用方法,感興趣的朋友快來看看吧2021-11-11SpringBoot后端服務(wù)重定向的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot后端服務(wù)重定向的實(shí)現(xiàn)示例,通過重定向、路徑匹配、反向代理和直接調(diào)用Controller層接口等方法來實(shí)現(xiàn),感興趣的可以了解一下2025-01-01Java返回文件時(shí)為圖片或pdf等設(shè)置在線預(yù)覽或下載功能
這篇文章主要介紹了Java返回文件時(shí)為圖片或pdf等設(shè)置在線預(yù)覽或下載功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01Spring boot監(jiān)控Actuator-Admin實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Spring boot監(jiān)控Actuator-Admin實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09透明化Sharding-JDBC數(shù)據(jù)庫字段加解密方案
這篇文章主要為大家介紹了透明化Sharding-JDBC數(shù)據(jù)庫字段加解密方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02SpringSecurity默認(rèn)登錄頁的使用示例教程
Spring 是非常流行和成功的 Java 應(yīng)用開發(fā)框架,Spring Security 正是 Spring 家族中的成員,Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案,本文給大家介紹SpringSecurity的默認(rèn)登錄頁的使用教程,感興趣的朋友一起看看吧2023-12-12