如何获取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插件. ...
随机推荐
- crontab[计划任务],tar[压缩],grep[查找]
计划任务:1.新建一个计划任务:crontab -e -----> 3*/1 * * * * date >> /tmp/data.txt查看计划任务:crontab -l.如果超过6 ...
- dvajs+antd定制主题踩坑记录
记一下刚刚解决的问题,困扰了几周,期间困兽争斗,甚至想放弃antd组件库.终于出来了,人类科技又进步了(才怪). 首先我按照dva官网建立了项目.里面引入antd的各种组件,因为需要用到一个switc ...
- 关于新手必须要理解的几个名词,cookie、session和token
以下要说的,虽然不是开发过程中必须会遇到的,但却是进阶之路上必须要掌握的,一些涉及到状态管理与安全的应用当中尤为重要. 我之前虽略有学习,但也是东拼西凑临时看的一点皮毛,所以在这个假期利用一点时间,整 ...
- System.Web.Mvc.EmptyResult.cs
ylbtech-System.Web.Mvc.EmptyResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, Public ...
- C++系列作业
1.编写一个完整的程序,实现功能:向用户提问“现在正在下雨吗?”,提示用户输入Y或N.若输入为Y,显示“现在正在下雨.”:若输入为N,显示“现在没有下雨”:否则继续提问“现在正在下雨吗?” #incl ...
- fastjson过滤字段
1.注解(字段上添加) @JSONField(serialize=false) 2.过滤器 PropertyFilter propertyFilter = new PropertyFilter() { ...
- 08_springmvc数据回显和@ModelAttribute注解详解
一.数据回显 提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面. 二.pojo数据回显方法 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法后,s ...
- 关于python DataFrame的学习记录
df_1 = pd.DataFrame({'A': [0, 1, 2], 'B': [3, 4, 5]}) print df_1 默认左边行index0往上递增,AB为顶部标识,数组内为内容 loc— ...
- Leetcode958. Check Completeness of a Binary Tree二叉树的完全验证性
给定一个二叉树,确定它是否是一个完全二叉树. 百度百科中对完全二叉树的定义如下: 若设二叉树的深度为 h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集 ...
- 2、mysql密码过期的修改方法(your password has expired)
今天打开SQLyog提示密码过期:Your password has expired 解决方法: 1. 启动MySQL服务 2. 启动MySQL后台 3. 执行以下命令 step 1: S ...