如何获取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> <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技术交流群,共同进步。
如何获取SpringBoot项目的applicationContext对象的更多相关文章
- SpringBoot项目的parent依赖和配置文件*.properties、*.yml详解
1.idea创建SpringBoot项目 idea创建SpringBoot项目应该对很多人来说已经是菜到不能到菜的操作了,但是对于初学者小白来说,还是要讲解一下的.打开idea,然后选择Spring ...
- spring-boot项目的docker集成化部署(一)
目录 spring-boot项目的docker集成化部署 前言 基本思路与方案 基本步骤 准备源码 服务器和基础环境 结语 1. 本文总结: 2. 后期优化: spring-boot项目的docker ...
- 获取apk项目的MD5值和SHA1值
一些可说可不说的话: * 以前有一个更简单的方法,在as的右边工具栏的 gradle 面板中可以很方便的获取到: * 上次用也是在2年前,时间长了给忘记了,不过我记得我当时写了笔记,这会笔记不在身边, ...
- 获取Gitlab项目的Token
获取Gitlab项目的Token 1.打开所需要Token的项目的主页进入CI/CD setting Setting -> CI/CD -> Genneral pioelines sett ...
- 关于springboot项目的jar和war两种打包方式部署的区别
关于springboot项目的jar和war两种打包方式部署的区别 关于springboot项目的jar和war两种打包方式部署的区别? https://bbs.csdn.net/topics/392 ...
- springboot项目的maven的pom.xml文件第一行报错 Unknown Error
springboot项目的maven的pom.xml文件第一行报错 Unknown Error https://blog.csdn.net/mini_jike/article/details/9239 ...
- SpringBoot中注入ApplicationContext对象的三种方式
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 在项目中,我们可 ...
- Spring boot 梳理 - SpringBoot中注入ApplicationContext对象的三种方式
直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applica ...
- Java springboot项目的jar发布方式
做springboot的都知道,发布方式不是war发布了,是jar发布,启动jar就可以直接运行,并且环境都是集成的. 首先,先将项目打包成jar,这里假设你的eclipse已经安装了maven插件. ...
随机推荐
- egret 篇——关于ios环境下微信浏览器的音频自动播放问题
前段时间公司突然想用egret(白鹭引擎)做一个金币游戏,大半个月边看文档边写吭哧吭哧也总算是弄完了.期间遇到一个问题,那就是ios环境下微信浏览器的音频自动播放问题. 个人感觉吧,egret自己封装 ...
- memcache课程---2、php如何操作memcache
memcache课程---2.php如何操作memcache 一.总结 一句话总结: windows下装好memcache.exe,装好memcache的php扩展之后,然后使用memcache函数库 ...
- CSS或HTML如何实现文字下面加点?
就像word里文字加着重号一样,在字的下面加一个点,用CSS怎么做?注意,我说的是下面加点,不是文字加粗或倾斜,请不要回答<strong>或<em>之类的. 把要着重加点的文字 ...
- 6月份Github上最热门的Java开源项目!
1.halo 这是一个轻快,简洁,功能强大,使用Java开发的博客系统. 项目地址:https://github.com/halo-dev/halo Star 6139 2.jeecg-boot ...
- SpringBoot 02_返回json数据
在SpringBoot 01_HelloWorld的基础上来返回json的数据,现在前后端分离的情况下多数都是通过Json来进行交互,下面就来利用SpringBoot返回Json格式的数据. 1:新建 ...
- FFmpeg工具
[0]安装ffmpeg //Linux系统下安装sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get update ...
- js中控制流管理的四种方法
引自http://es6.ruanyifeng.com/#docs/generator#yield--表达式 1.常用的回调方法 step1(function (value1) { step2(val ...
- [Bzoj3743][Coci2015] Kamp【换根Dp】
Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...
- 简单排列习题2.5 的 2 - 6 P35
用1,2,3,...9组成3个3位数abc, def, ghi:每个数字恰好用一次,要求 abc:def :ghi = 1: 2 : 3:按照abc : def : ghi的格式输出. 通常想到的思路 ...
- [转]深入WPF--Style
Style 用来在类型的不同实例之间共享属性.资源和事件处理程序,您可以将 Style 看作是将一组属性值应用到多个元素的捷径. 这是MSDN上对Style的描述,翻译的还算中规中矩.Style(样式 ...