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

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

免費教程專題

恒宇少年在博客整理三套免費學習教程專題,由于文章偏多特意添加了閱讀指南,新文章以及之前的文章都會在專題內陸續填充,希望可以幫助大家解惑更多知識點。

本章目標

基于SpringBoot平臺完成ApplicationContext對象的獲取,并通過實例手動獲取Spring管理的bean.

SpringBoot 企業級核心技術學習專題


專題 專題名稱 專題描述
001 Spring Boot 核心技術 講解SpringBoot一些企業級層面的核心組件
002 Spring Boot 核心技術章節源碼 Spring Boot 核心技術簡書每一篇文章碼云對應源碼
003 Spring Cloud 核心技術 對Spring Cloud核心技術全面講解
004 Spring Cloud 核心技術章節源碼 Spring Cloud 核心技術簡書每一篇文章對應源碼
005 QueryDSL 核心技術 全面講解QueryDSL核心技術以及基于SpringBoot整合SpringDataJPA
006 SpringDataJPA 核心技術 全面講解SpringDataJPA核心技術
007 SpringBoot核心技術學習目錄 SpringBoot系統的學習目錄,敬請關注點贊!!!

構建項目

本章項目不需要太多的內容,添加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上下文對象
 * ========================
 * 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的實例。如下所示:

@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實例手動獲取。

SpringBoot配套源碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套源碼地址:https://gitee.com/hengboy/spring-cloud-chapter

作者個人 博客
使用開源框架 ApiBoot 助你成為Api接口服務架構師

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,954評論 6 342
  • 來源:關于Spring IOC (DI-依賴注入)你需要知道的一切作者:zejian Dao層(AccountDa...
    楊井閱讀 5,364評論 0 27
  • 1. 人啊,最怕自我感覺良好。古代的皇帝們,凡是自我感覺良好的,都想長生不老。后來呢,無非塵歸塵土歸土罷了。 2....
    二月維拉閱讀 224評論 0 0
  • 第一次接觸“云”這個東西,得從四年前我買的第一部智能手機‘小七’-天語w700(阿里云手機)談起。當時這款手機提供...
    七歌閱讀 434評論 0 0