如何获取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
========================
*/
public class ApplicationContextProvider
implements ApplicationContextAware
{
/**- 上下文对象实例
*/
private ApplicationContext applicationContext;
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> <T></br>
* <span class="hljs-doctag">@return</span></br>
*/</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <T> <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(Class<T> 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> <T></br>
* <span class="hljs-doctag">@return</span></br>
*/</span></br>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <T> <span class="hljs-function">T <span class="hljs-title">getBean</span><span class="hljs-params">(String name,Class<T> 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技术交流群,共同进步。