第三十二章:如何獲取SpringBoot項目的applicationContext對象

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

本章目標

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

構建項目

本章項目不須要太多的內容,添加Web依賴就能夠了。api

ApplicationContextAware

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

實現ApplicationContextAware接口

建立一個實體類並實現ApplicationContextAware接口,重寫接口內的setApplicationContext方法來完成獲取ApplicationContext實例的方法,代碼以下所示:app

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上下文對象
 * ========================
 * Created with IntelliJ IDEA.
 * User:恆宇少年
 * Date:2017/8/26
 * Time:23:25
 * 碼雲:http://git.oschina.net/jnyqy
 * ========================
 */
@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的實例。以下所示:ide

@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方法來爲咱們設置上下文實例。spring-boot

總結

本章內容較少,主要講解了SpringBoot平臺下采用ApplicationContextAware的方式完成ApplicationContext實例的獲取,並經過ApplicationContext實例完成對Spring管理的Bean實例手動獲取。學習

SpringBoot配套源碼地址:gitee.com/hengboy/spr…
SpringCloud配套源碼地址:gitee.com/hengboy/spr…
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄
感謝閱讀!
歡迎加入QQ技術交流羣,共同進步。
ui

QQ技術交流羣
相關文章
相關標籤/搜索