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

Springboot如何獲取上下文ApplicationContext

 更新時間:2021年11月20日 16:21:49   作者:北漂小白菜  
這篇文章主要介紹了Springboot如何獲取上下文ApplicationContext,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Springboot獲取上下文ApplicationContext

在項目中遇到了一個場景,就是通過獲得上下文然后獲取特定的bean。在此遇到了不小的坑,故留下這個篇文章,做個記錄。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
@Component
public class SpringContextUtil implements ApplicationContextAware {
    /**
     * 上下文對象實例
     */
    private static ApplicationContext applicationContext;
 
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
 
    /**
     * 獲取applicationContext
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
 
    /**
     * 通過name獲取 Bean.
     * @param name
     * @return
     */
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }
 
    /**
     * 通過class獲取Bean.
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }
 
    /**
     * 通過name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}

看上面的代碼,可以看到在工具類中一開始是聲明了一個ApplicationContext類型的靜態(tài)變量,但是由于靜態(tài)變量是不能被Spring容器管理的,一開始用正常的getter和setter方法不能獲取到特定的bean,實踐證明,需要在此變量的setter方法上加上@Autowired注解,并且去除setter方法中的static關(guān)鍵字。才可實現(xiàn)特定bean的注入。

springboot的應(yīng)用上下文

springboot上下文有兩個

  • ServletWebServerApplicationContext
  • AnnotationConfigServletWebServerApplicationContext(繼承上面)

ServletWebServerApplicationContext

該類屬于spring-boot-2.1.1Release.jar中,是自springboot誕生就衍生出來的,是spring框架的應(yīng)用上下文Application的子類。

多說無益,show me code

擴(kuò)展的功能

首先讓我們來看一下,這個類到底做了什么,有什么存在的價值?

    private volatile WebServer webServer;
 @Override
 protected void onRefresh() {
  super.onRefresh();
  try {
   createWebServer();
  }
  catch (Throwable ex) {
   throw new ApplicationContextException("Unable to start web server", ex);
  }
 }

在此類中有個WebServer成員變量,讓我們用腳趾頭想一下也應(yīng)該可以知道,這其實就是web服務(wù)對象,也基本上可以猜測就是跟tomcat相關(guān)了(當(dāng)然也可以是其他web服務(wù)器,如jetty)

然后我們又發(fā)現(xiàn)了onRefresh方法,相信我們并不陌生,這就是spring核心refresh方法的中一個鉤子方法(即表明此時已經(jīng)加載所有配置bean),進(jìn)行WebServer對象的創(chuàng)建

 @Override
 protected void finishRefresh() {
  super.finishRefresh();
  WebServer webServer = startWebServer();
  if (webServer != null) {
   publishEvent(new ServletWebServerInitializedEvent(webServer, this));
  }
 }

我們又發(fā)現(xiàn)該類存在finishRefresh,仔細(xì)想一下,這個也是spring核心#refresh方法中的一個鉤子方法(不過這個特別,因為該方法是refresh方法中的最后一步,即會去實例化spring容器中的所有beandefinition對象)

首先贊一個,這個很巧妙,調(diào)用了super.finishRefresh() ,并沒有丟棄父類的邏輯功能(這點在多態(tài)中,我相信還是會有人犯錯,本來是擴(kuò)展功能,但是直接重寫,丟棄了父類的方法,當(dāng)然spring框架開發(fā)大佬肯定不會犯這種錯誤,對吧?。?/p>

第二點重點來了,就是startWebServer,也就是在spring完成實例化之后,就會去啟動web服務(wù)。

AnnotationConfigServletWebServerApplicationContext

小結(jié)一下:

首先此類是springboot啟動運行run()創(chuàng)建ApplicationContext的實現(xiàn)類,不過很可惜,該類并沒有很強(qiáng)的實質(zhì)性擴(kuò)展。

**唯一作用就是擁有了通過注解加載配置類的作用,即和AnnotationConfigApplication一樣,只不過springboot的運行啟動已經(jīng)是通過注解加載bean類**

(雖然是雞肋,不過這也符合spring創(chuàng)建類的一貫風(fēng)格,就是每個類都是高內(nèi)聚的,即每個類除了父類的功能之外,還都擁有其他擴(kuò)展的作用。即使創(chuàng)建出來還沒有用到就被遺棄,但仍然不能阻止spring開發(fā)大佬創(chuàng)建該類,哈哈)

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

相關(guān)文章

  • Java基礎(chǔ)泛型詳情

    Java基礎(chǔ)泛型詳情

    這篇文章主要介紹了Java基礎(chǔ)泛型詳情,泛型是JDK5中引入的特性,它提供了編譯時類型安全檢測機(jī)制,該機(jī)制允許在編譯時檢測到非法的類型,下面文章的詳細(xì)介紹,需要的朋友可以參考一下
    2022-04-04
  • Java簡單實現(xiàn)session保存到redis的方法示例

    Java簡單實現(xiàn)session保存到redis的方法示例

    這篇文章主要介紹了Java簡單實現(xiàn)session保存到redis的方法,結(jié)合實例形式分析了Java將session存入redis緩存服務(wù)器的相關(guān)設(shè)置、實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下
    2018-05-05
  • Java clone方法詳解及簡單實例

    Java clone方法詳解及簡單實例

    這篇文章主要介紹了 Java clone方法詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring?IOC注入的兩種方式詳解以及代碼示例

    Spring?IOC注入的兩種方式詳解以及代碼示例

    在Spring框架中,依賴注入(Dependency?Injection,DI)是通過控制反轉(zhuǎn)(Inversion?of?Control,IOC)實現(xiàn)的,Spring提供了多種方式來實現(xiàn)IOC注入,本文就給大家介紹兩種注入的方式:基于XML和基于注解,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • 使用java實現(xiàn)BBS論壇發(fā)送郵件過程詳解

    使用java實現(xiàn)BBS論壇發(fā)送郵件過程詳解

    這篇文章主要介紹了使用java發(fā)送郵件過程詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 詳解 maven的pom.xml用<exclusion>解決版本問題

    詳解 maven的pom.xml用<exclusion>解決版本問題

    這篇文章主要介紹了詳解 maven的pom.xml用<exclusion>解決版本問題的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • springboot自動重啟的簡單方法

    springboot自動重啟的簡單方法

    Springboot提供了熱部署的方式,當(dāng)發(fā)現(xiàn)任何類發(fā)生了改變,馬上通過JVM類加載的方式,加載最新的類到虛擬機(jī)中。這篇文章主要介紹了springboot自動重啟的實現(xiàn)方法,需要的朋友可以參考下
    2018-04-04
  • java實現(xiàn)斗地主游戲

    java實現(xiàn)斗地主游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)斗地主游戲,洗牌、發(fā)牌、看牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java實現(xiàn)Executors類創(chuàng)建常見線程池

    Java實現(xiàn)Executors類創(chuàng)建常見線程池

    本文主要介紹了Java實現(xiàn)Executors類創(chuàng)建常見線程池,在Java中,可以通過Executors工廠類提供四種常見類型的線程池,下面就來介紹一下這四種的方法實現(xiàn),感興趣的可以了解一下
    2023-11-11
  • Java獲取視頻時長、大小的示例

    Java獲取視頻時長、大小的示例

    這篇文章主要介紹了Java獲取視頻時長、大小的示例,幫助大家利用Java處理視頻,完成需求,感興趣的朋友可以了解下
    2020-11-11

最新評論