SpringBoot项目中获取applicationContext对象
ApplicationContext 对象是Spring开源框架的上下文对象实例,也就是我们常说的Spring容器,一般情况下我们是不用手动来管理它,而是由Spring框架自己来维护bean之间的关系,但不排除我们有的时候需要手动获取Spring容器(比如获取多例bean的时候),传统的获取ApplicationContext 的方式有很多种,这里介绍官方推荐的方式:使用ApplicationContextAware接口。
其实以实现ApplicationContextAware接口的方式获取ApplicationContext 对象实例并不是SpringBoot特有的功能,早在Spring3.0x版本之后就存在了这个接口,在传统的Spring项目内同样是可以以实现ApplicationContextAware接口的方式获取到ApplicationContext 实例的。具体使用代码如下:
package com.example.demo; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; @Component
public class MyApplicationContext implements ApplicationContextAware {
/**
* 上下文对象实例
*/
private ApplicationContext applicationContext; /**
* 实现ApplicationContextAware接口的方法
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
} /**
* 获取applicationContext
*
* @return
*/
public ApplicationContext getApplicationContext() {
return applicationContext;
} /**
* 通过bean的名字获取 Bean.
*
*/
public Object getBean(String name) {
return getApplicationContext().getBean(name);
} /**
* 通过类名获取Bean.
*
*/
public <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
} }
在MyApplicationContext上是有@Component注解的,Spring会自动调用setApplicationContext方法来为我们设置上下文实例,所以我们可以在需要获取上下文的实体内中注入MyApplicationContext对象,进而使用其中的方法来获取上下文对象等。如果想在非Spring管理的实体内使用ApplicationContext,这时我们可以修改ApplicationContext实例对象为静态实例,方法改为静态方法,这样在外部同样是可以获取到指定Bean的实例,示例如下:
package com.example.demo; import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component; @Component
public class MyApplicationContextUtil implements ApplicationContextAware {
/**
* 上下文对象实例
*/
private static ApplicationContext myApplicationContext; /**
* 实现ApplicationContextAware接口的方法
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
myApplicationContext = applicationContext;
} /**
* 获取applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return myApplicationContext;
} /**
* 通过bean的名字获取 Bean.
*
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
} /**
* 通过类名获取Bean.
*
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
}
SpringBoot项目中获取applicationContext对象的更多相关文章
- springboot 项目中获取默认注入的序列化对象 ObjectMapper
在 springboot 项目中使用 @SpringBootApplication 会自动标记 @EnableAutoConfiguration 在接口中经常需要使用时间类型,Date ,如果想要格式 ...
- spring中获取ApplicationContext对象的技巧,含源码说明
第一步,实现接口ApplicationContextAware,重写setApplicationContext方法,下方代码标红的地方,绿色部分 可以通过声明来进行存储到本类中. @Component ...
- 在web项目中获取ApplicationContext上下文的3种主要方式及适用情况
最近在做web项目,需要写一些工具方法,涉及到通过Java代码来获取spring中配置的bean,并对该bean进行操作的情形.而最关键的一步就是获取ApplicationContext,过程中纠结和 ...
- 在springboot项目中获取pom.xml中的信息
最近做了一个新项目,用到了springboot.在搭建框架的过程中,需要读取pom.xml中version的值,本来想着是用自己用java解析xml来着.没想到maven提供了这么一个包,可以直接获取 ...
- linux环境下在springboot项目中获取项目路径(用于保存文件等)
//application.properties中设置:(file.path=static/qrfile/)//保存到static文件夹下的qrfile目录@Value("${file.pa ...
- web项目中获取spring的bean对象
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中不通过注解的形式(@Resource.@Autowired)获取Spring配置的bean呢? Bean工厂(c ...
- 在Spring应用中创建全局获取ApplicationContext对象
在Spring应用中创建全局获取ApplicationContext对象 1.需要创建一个类,实现接口ApplicationContextAware的setApplicationContext方法. ...
- SpringBoot项目中遇到的BUG
1.启动项目的时候报错 1.Error starting ApplicationContext. To display the auto-configuration report re-run you ...
- SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL
1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...
随机推荐
- 编写高质量代码改善C#程序的157个建议——建议82:Parallel简化但不等同于Task默认行为
建议82:Parallel简化但不等同于Task默认行为 建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用.也就是说,在运行Paralle ...
- 深入理解linux的权限设置和SUID,SGID以及粘滞位
我们知道文件的权限可以用三个八进制数字表示.其实文件的权限应该用四个八进制来表示,不过用 ls -l 命令时,只显示三个罢了.那个没有显示的八进制数字其实是第一个,它用来设定一些特殊权限.这个八进制数 ...
- Canvas vs. SVG[转]
Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的. SVG SVG 是一种使用 XML 描述 2D 图形的语言. SVG 基于 XML,这意味着 SVG DOM 中的每个 ...
- VC6.0 如何显示代码行号
VC6.0是一款比较经典.稳定的功能强大的IDE,目前也有很多人在使用.但美中不足的是它不能像其他IDE那样显示行号.这里需要用到一个插件VC6LineNumberAddin, 下载地址:http:/ ...
- 修复DBGrideh使用TMemTableEh在Footers求平均值为0的Bug
在一个项目中,使用DBGrideh,当使用自带的内存数据集时,对于Footers添加的求平均值,一直显示为0,其他汇总数据都是可以的,而切换使用TClientDataSet或者TADODataSet, ...
- php获取数组的键值
<?php header ( "Content-type: text/html; charset=utf-8" ); $info[; $info[; $info[; $inf ...
- 基于flask的轻量级webapi开发入门-从搭建到部署
基于flask的轻量级webapi开发入门-从搭建到部署 注:本文的代码开发工作均是在python3.7环境下完成的. 关键词:python flask tornado webapi 在python虚 ...
- BZOJ3638|CodeForces 280D k-Maximum Subsequence Sum
题目链接:戳我 一类典型模型.线段树模拟网络流+区间最大K段和. 因为不会写,所以参考了黄学长的博客.但是我觉得他说得不够详细,所以想好好地解释一下: 前置技能1:区间最大子段和 如果K=1的时候怎么 ...
- jQuery find()方法 eq()方法
find() 使用: 返回 <ul> 后代中所有的 <span> 元素: $(document).ready(function(){$("ul").find ...
- powshel 控制目录文件权限
for($file=[IO.File]::OpenText("C:\Users\Administrator\Desktop\user_list.txt") ; !($file.En ...