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

springboot 項(xiàng)目容器啟動后如何自動執(zhí)行指定方法

 更新時間:2021年11月09日 10:31:16   作者:笙簫123  
這篇文章主要介紹了springboot 項(xiàng)目容器啟動后如何自動執(zhí)行指定方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springboot 項(xiàng)目容器啟動后自動執(zhí)行指定

我們需要寫一個class去讓它實(shí)現(xiàn)ApplicationRunner,然后重寫它的run方法就行了,注意類加上@Component注解

注意:這個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)前時間:"+ DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
    }
}

springboot 容器及啟動過程

SpringBoot會啟動兩個容器,即父子容器

  • 父容器(Spring容器):AnnotationConfigWebApplicationContex
  • 子容器(SpringMVC容器):AnnotationConfigEmbeddedWebApplicationContex

思考幾個問題:

問題1:為什么要啟動父子兩個容器?

在Spring整體框架的核心概念中,容器是核心思想,而在一個項(xiàng)目中,容器不一定只有一個,Spring中可以包括多個容器,使用上下層關(guān)系來管理容器可以解決公共屬性抽取的問題,即將公共的屬性放到父容器中,對其各個子容器均可見,實(shí)現(xiàn)了復(fù)用功能,注意子容器對父容器是不可見的。

問題2:在什么時候啟動父容器?

準(zhǔn)備環(huán)境變量,即執(zhí)行prepareEnvironment方法時,發(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方法時,BootstrapApplicationListener監(jiān)聽器不再重復(fù)執(zhí)行?

父容器初始化完成后,會在webEnvironment屬性中加入bootstrap屬性標(biāo)識,這樣就可以根據(jù)該標(biāo)識來判斷是否需要執(zhí)行了

問題5:容器實(shí)際通過什么來管理bean

容器通過beanFactory來管理對象,父子容器都會各持有一個DefaultListableBeanFactory,即父子容器都會管理各自的bean。

子容器啟動流程:

1.執(zhí)行初始化:初始化webEnvironment以及l(fā)isteners

2.發(fā)布容器啟動事件

3.在執(zhí)行prepareEnvironment步驟時,發(fā)布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener監(jiān)聽器收到該事件,會再次調(diào)用SpringApplication

  • 初始化和run方法(初始化父容器的步驟類似子容器)

4.創(chuàng)建context,通過判斷webEnvironment標(biāo)識,這時為true,創(chuàng)建AnnotationConfigEmbeddedWebApplicationContext實(shí)例

5.執(zhí)行refreshContext,比較核心的方法,詳細(xì)說一下:

  • 獲取bean工廠,即創(chuàng)建DefaultListableBeanFactory實(shí)例
  • 為bean工廠賦一些基礎(chǔ)屬性,主要有類加載器
  • 為bean工廠注冊WebApplicationContextServletContextAwareProcessor,一個BeanPostProcessor,主要用于獲取ServletContext
  • 執(zhí)行beanFactoryPostProcessor,遞歸處理,主要用于掃描@CompontScan、@Import、@ImportSource等注解的類,首先注冊bean元數(shù)據(jù)到工廠,然后可以修改bean工廠
  • 實(shí)例化BeanPostProcessor類并注冊到bean工廠單例列表中
  • 實(shí)例化消息通知類并注冊到bean工廠單例列表中
  • 調(diào)用onRefresh方法,初始化一個植入的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事件

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot詳解整合swagger方案

    springboot詳解整合swagger方案

    Swagger是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化?Restful?風(fēng)格的?Web?服務(wù)。總體目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法、參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2022-07-07
  • 一鍵清除maven倉庫中下載失敗的jar包的實(shí)現(xiàn)方法

    一鍵清除maven倉庫中下載失敗的jar包的實(shí)現(xiàn)方法

    這篇文章主要介紹了一鍵清除maven倉庫中下載失敗的jar包的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java實(shí)現(xiàn)把對象數(shù)組通過excel方式導(dǎo)出的功能

    java實(shí)現(xiàn)把對象數(shù)組通過excel方式導(dǎo)出的功能

    本文主要介紹了java實(shí)現(xiàn)把對象數(shù)組通過excel方式導(dǎo)出的功能的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • Java實(shí)現(xiàn)給Word文件添加文字水印

    Java實(shí)現(xiàn)給Word文件添加文字水印

    Word中設(shè)置水印時,可預(yù)設(shè)的文字或自定義文字設(shè)置為水印效果,但通常添加水印效果時,會對所有頁面都設(shè)置成統(tǒng)一效果。本文將利用Java給Word每一頁設(shè)置不同文字水印效果,需要的可以參考一下
    2022-02-02
  • java使用EditText控件時不自動彈出輸入法的方法

    java使用EditText控件時不自動彈出輸入法的方法

    這篇文章主要介紹了java使用EditText控件時不自動彈出輸入法的方法,需要的朋友可以參考下
    2015-03-03
  • Java使用PreparedStatement接口及ResultSet結(jié)果集的方法示例

    Java使用PreparedStatement接口及ResultSet結(jié)果集的方法示例

    這篇文章主要介紹了Java使用PreparedStatement接口及ResultSet結(jié)果集的方法,結(jié)合實(shí)例形式分析了PreparedStatement接口及ResultSet結(jié)果集的相關(guān)使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • javaweb實(shí)現(xiàn)百度GPS定位接口(經(jīng)緯度)

    javaweb實(shí)現(xiàn)百度GPS定位接口(經(jīng)緯度)

    這篇文章主要介紹了javaweb實(shí)現(xiàn)百度GPS定位接口(經(jīng)緯度),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot自定義注解及AOP的開發(fā)和使用詳解

    SpringBoot自定義注解及AOP的開發(fā)和使用詳解

    在公司項(xiàng)目中,如果需要做一些公共的功能,如日志等,最好的方式是使用自定義注解,自定義注解可以實(shí)現(xiàn)我們對想要添加日志的方法上添加,這篇文章基于日志功能來講講自定義注解應(yīng)該如何開發(fā)和使用,需要的朋友可以參考下
    2023-08-08
  • java使用poi在excel單元格添加超鏈接設(shè)置字體顏色的方法

    java使用poi在excel單元格添加超鏈接設(shè)置字體顏色的方法

    這篇文章主要介紹了java使用poi在excel單元格添加超鏈接,設(shè)置字體顏色,poi功能還是很強(qiáng)大的,基本能想到的功能都能通過poi實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Feign 使用HttpClient和OkHttp方式

    Feign 使用HttpClient和OkHttp方式

    這篇文章主要介紹了Feign 使用HttpClient和OkHttp方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論