如何获取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核心技术

构建项目

本章项目不需要太多的内容,添加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;

<span class="hljs-meta">@Override</span></br>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setApplicationContext</span><span class="hljs-params">(ApplicationContext applicationContext)</span> <span class="hljs-keyword">throws</span> BeansException </span>{</br>
    <span class="hljs-keyword">this</span>.applicationContext = applicationContext;</br>
}</br></br>

<span class="hljs-comment">/**</br>
 * 获取applicationContext</br>
 * <span class="hljs-doctag">@return</span></br>
 */</span></br>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> ApplicationContext <span class="hljs-title">getApplicationContext</span><span class="hljs-params">()</span> </span>{</br>
    <span class="hljs-keyword">return</span> applicationContext;</br>
}</br></br>

<span class="hljs-comment">/**</br>
 * 通过name获取 Bean.</br>
 * <span class="hljs-doctag">@param</span> name</br>
 * <span class="hljs-doctag">@return</span></br>
 */</span></br>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Object <span class="hljs-title">getBean</span><span class="hljs-params">(String name)</span></span>{</br>
    <span class="hljs-keyword">return</span> getApplicationContext().getBean(name);</br>
}</br>

<span class="hljs-comment">/**</br>
 * 通过class获取Bean.</br>
 * <span class="hljs-doctag">@param</span> clazz</br>
 * <span class="hljs-doctag">@param</span> &lt;T&gt;</br>
 * <span class="hljs-doctag">@return</span></br>
 */</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> &lt;T&gt; <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(Class&lt;T&gt; clazz)</span></span>{
    <span class="hljs-keyword">return</span> getApplicationContext().getBean(clazz);
}</br></br>

<span class="hljs-comment">/**</br>
 * 通过name,以及Clazz返回指定的Bean</br>
 * <span class="hljs-doctag">@param</span> name</br>
 * <span class="hljs-doctag">@param</span> clazz</br>
 * <span class="hljs-doctag">@param</span> &lt;T&gt;</br>
 * <span class="hljs-doctag">@return</span></br>
 */</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> &lt;T&gt; <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(String name,Class&lt;T&gt; clazz)</span></span>{</br>
    <span class="hljs-keyword">return</span> getApplicationContext().getBean(name, clazz);</br>
}</br>

}

这里要注意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
SpringBoot相关系列文章请访问:目录:SpringBoot学习目录
QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录
SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录
感谢阅读!
欢迎加入QQ技术交流群,共同进步。

posted @ 2018-02-06 10:00  星朝  阅读(607)  评论(0编辑  收藏  举报