如何獲取SpringBoot項目的applicationContext對象


ApplicationContext對象是 Spring開源框架的上下文對象實例,在項目運行時自動裝載 Handler內的所有信息到內存。
傳統的獲取方式有很多種,不過隨着 Spring版本的不斷迭代,官方也慢慢的不建議使用部分方式。
下面我簡單介紹一種 Spring官方推薦使用的方式!

基於SpringBoot平台完成ApplicationContext對象的獲取,並通過實例手動獲取Spring管理的bean.

構建項目

本章項目不需要太多的內容,添加Web依賴就可以了。

ApplicationContextAware

這個接口對象就是我們今天的主角,其實以實現 ApplicationContextAware接口的方式獲取 ApplicationContext對象實例並不是SpringBoot特有的功能,
早在Spring3.0x版本之后就存在了這個接口,在傳統的 Spring項目內同樣是可以獲取到 ApplicationContext實例的,下面我們看看該如何編碼才能達到我們的效果呢?

實現ApplicationContextAware接口

創建一個實體類並實現ApplicationContextAware接口,重寫接口內的setApplicationContext方法來完成獲取ApplicationContext實例的方法,代碼如下所示:
package com.xunmei.api;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 獲取Spring上下文對象
 * */
@Component public class ApplicationContextProvider implements ApplicationContextAware
{
    /**
     * 上下文對象實例 */
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 獲取applicationContext
     * @return
     */
    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通過name獲取 Bean.
     * @param name
     * @return
     */
    public Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    /**
     * 通過class獲取Bean.
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz);
    }

    /**
     * 通過name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz);
    }
}

我們拿到ApplicationContext對象實例后就可以手動獲取Bean的注入實例對象,

ApplicationContextProvider類內我簡單的實現了幾個方法來獲取指定的Bean實例,當然你可以添加更多的方法來完成更多的業務邏輯。

如果你是想在Spring管理的實體內使用ApplicationContext還不想采用注入ApplicationContextProvider來完成實例化,

這時我們可以修改ApplicationContext實例對象為靜態實例,方法改為靜態方法,這樣在外部同樣是可以獲取到指定Bean的實例。如下所示:

@Component public class ApplicationContextProvider implements ApplicationContextAware
{
    /**
     * 上下文對象實例
     */
    private static ApplicationContext applicationContext;

    @Override
    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);
    }
}
這里要注意ApplicationContextProvider類上的@Component注解是不可以去掉的,去掉后Spring就不會自動調用setApplicationContext方法來為我們設置上下文實例。

總結

本章內容較少,主要講解了 SpringBoot平台下采用 ApplicationContextAware的方式完成 ApplicationContext實例的獲取,並通過 ApplicationContext實例完成對 Spring管理的 Bean實例手動獲取
參考:https://www.jianshu.com/p/3cd2d4e73eb7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM