如何获取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
========================
*/
@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插件. ...
随机推荐
- 廖雪峰Java14Java操作XML和JSON-1XML-3SAX
SAX:Simple API for XML 基于事件的API import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXPars ...
- Django + Uwsgi + Nginx 的生产环境部署实战
目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...
- 牛人blog 头脑风暴 (持续添加与更新)
Http协议详解 http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html android 实现分享功能两种方法 http://w ...
- Linux RHEL7(CentOS7源) 安装 Nginx
安装步骤 1.添加 Nginx 源地址 CentOS7 默认没有提供 Nginx 的源,但 Nginx 自己提供了 sudo rpm -Uvh http://nginx.org/packages/ce ...
- 图数据库neo4j和关系数据库的区别
相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题.例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与.通常情况下这些人员常常都被抽象为Person类型,对应 ...
- angular 基本树结构
HTML: http://www.ngnice.com/showcase/#/tree/basic <link rel="stylesheet" href="vie ...
- python 拷贝某个文件到另一个目录下
python的shutil包含有很多文件拷贝的函数,各种各样的,要实现我文章题目的目的,使用shutil.copy函数即可 shutil.copy(文件的路径,另一个目录)
- 解决wordpress 5.3更新后Uncaught Typeerror: $ is not a function
本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:解决wordpress 5.3更新后Uncaught Typeerror: $ is not a function: 本文通过插件的办法解 ...
- Trie树 模板
普通Trie: struct TRIE{ ],tot,end[MAXN]; TRIE(){tot=;} void insert(char *s){//s为要插入的字符串 int len=strlen( ...
- csp-s模拟43,44 A,C,F
题面:https://www.cnblogs.com/Juve/articles/11534880.html A: T可以写成如下形式:$T=b^k*S+m*a$, 其中$m=\sum\limits_ ...