如何手动获取spring/springboot中的IOC容器(全局上下文对象)?

IDE:IntelliJ IDEA 2022.2.3 x64
操作系统:win10 x64 位 家庭版
JDK: 1.8


文章目录

  • 前言
  • 一、如何手动获取spring容器[ApplicationContext]?
    • 方式①:在启动类中获取spring容器
    • 方式②:自定义工具类实现ServletContextListener接口以获取spring容器[推荐web项目]
    • 方式③:自定义工具类实现ApplicationContextAware接口以获取spring容器
    • 方式④:自定义工具类继承ApplicationObjectSupport抽象类以获取spring容器
    • 方式⑤:自定义工具类继承WebApplicationObjectSupport抽象类以获取spring容器
    • 参考资料


前言

众所周知,在Spring框架中的全局上下文对象通常被称为ApplicationContext。这是Spring容器的一种表现形式,负责管理和控制应用程序中的对象(Bean)。它本质上维护了Bean的定义以及对象间的协作关系。当项目运行时,ApplicationContext会自动装载所有在Handler中的信息到内存。此外,Spring上下文也是一种配置文件,能向Spring框架提供上下文信息。因此,我们可以说ApplicationContext是Spring框架的核心部分,提供了各种便利服务来帮助应用程序开发。


提示:以下是本篇文章正文内容,下面案例可供参考

一、如何手动获取spring容器[ApplicationContext]?

方式①:在启动类中获取spring容器

在启动类中获取spring容器

代码示例如下

@SpringBootApplication
public class UserApplication {//在启动类运行时获取spring容器对象public static ConfigurableApplicationContext context;public static void main(String[] args) {context = SpringApplication.run(UserApplication.class,args);}
}

在自定义Controller类中调用启动类中获得的spring容器

	@GetMapping("/sayhi1")public String sayhi1(){//从spring容器中获取Myservice这个bean,然后调用该bean的sayHi1()方法MyService myService = UserApplication.context.getBean(MyService.class);return myService.sayHi();}

测试

在这里插入图片描述


方式②:自定义工具类实现ServletContextListener接口以获取spring容器[推荐web项目]

自定义工具类实现ServletContextListener接口

示例代码如下


import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener@Component
public class MyWebApplicationContext implements ServletContextListener{private ServletContext servletcontext;@Overridepublic void contextInitialized(ServletContextEvent sce) {this.servletcontext = sce.getServletContext();}public ApplicationContext getApplicationcontext() {return WebApplicationContextUtils.getWebApplicationContext(this.servletcontext);}
}

在自定义Controller类中注入上面写好的工具类,然后获取spring容器

  	@Autowiredprivate MyWebApplicationContext myWebApplicationContext;@GetMapping("/sayhi2")public String sayhi2(){//使用工具类获取spring容器,然后从中得到myService 这个bean,调用其中的sayHi()方法MyService myService = myWebApplicationContext.getApplicationcontext().getBean(MyService.class);return myService.sayHi();}

测试

在这里插入图片描述


方式③:自定义工具类实现ApplicationContextAware接口以获取spring容器

自定义工具类实现ApplicationContextAware接口

示例代码如下

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class MyApplicationAware implements ApplicationContextAware {private ApplicationContext applicationcontext;@Overridepublic void setApplicationContext(ApplicationContext applicationcontext) throws BeansException {this.applicationcontext = applicationcontext;}public ApplicationContext getApplicationcontext() {return this.applicationcontext;}
}

在自定义Controller类中注入上面写好的工具类,然后获取spring容器

@Autowiredprivate MyApplicationAware myApplicationAware;@GetMapping("/sayhi3")public String sayhi3(){//使用工具类获取spring容器,然后从中得到myService 这个bean,调用其中的sayHi()方法MyService myService = myApplicationAware.getApplicationcontext().getBean(MyService.class);return myService.sayHi();}

测试

在这里插入图片描述


方式④:自定义工具类继承ApplicationObjectSupport抽象类以获取spring容器

自定义工具类继承ApplicationObjectSupport抽象类

代码示例如下

import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.stereotype.Component;@Component
public class MyApplicationObjectSupport extends ApplicationObjectSupport {
}

在自定义Controller类中注入上面写好的工具类,然后获取spring容器

	@Autowiredprivate MyApplicationObjectSupport myApplicationObjectSupport;@GetMapping("/sayhi4")public String sayhi4(){//使用工具类获取spring容器,然后从中得到myService 这个bean,调用其中的sayHi()方法MyService myService = myApplicationObjectSupport.getApplicationContext().getBean(MyService.class);return myService.sayHi();}

测试

在这里插入图片描述


方式⑤:自定义工具类继承WebApplicationObjectSupport抽象类以获取spring容器

自定义工具类继承WebApplicationObjectSupport抽象类

代码示例如下


import org.springframework.stereotype.Component;
import org.springframework.web.context.support.WebApplicationObjectSupport;@Component
public class MyWebApplicationObjectSupport extends WebApplicationObjectSupport {
}

在自定义Controller类中注入上面写好的工具类,然后获取spring容器

	@Autowiredprivate MyWebApplicationObjectSupport myWebApplicationObjectSupport;@GetMapping("/sayhi5")public String sayhi5(){//使用工具类获取spring容器,然后从中得到myService 这个bean,调用其中的sayHi()方法MyService myService = myWebApplicationObjectSupport.getApplicationContext().getBean(MyService.class);return myService.sayHi();}

测试

在这里插入图片描述


参考资料

https://www.bilibili.com/video/BV1QP4y137Tz/?spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=5a34715e416a427a73a3ca52397848b5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL_主从复制_环境搭建

MySQL主从复制配置 CentOS 7 配置 阿里云 yum 源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo sudo yum clean all sudo yum makeca…

Typecho V1.2.1 博客更换域名还原

网站老是到期或则要换服务器(IP地址),单独改IP老是有图片不能加载,出个完整的迁移教程: 系统环境:Ubuntu 2204 宝塔面板 8.0.3 Nginx1.22 PHP 8.1 MySQL 5.7 备份 进入宝塔将网站根目录直接压缩&#xff0…

pytorch复现_UNet

什么是UNet U-Net由收缩路径和扩张路径组成。收缩路径是一系列卷积层和汇集层,其中要素地图的分辨率逐渐降低。扩展路径是一系列上采样层和卷积层,其中特征地图的分辨率逐渐增加。 在扩展路径中的每一步,来自收缩路径的对应特征地图与当前特征…

MySQL -- 索引

MySQL – 索引 文章目录 MySQL -- 索引一、索引简介1.简介2.索引效率的案例 二、认识磁盘1.磁盘2.结论3.磁盘随机访问(Random Access)与连续访问(Sequential Access) 三、MySQL 与磁盘交互基本单位1.基本单位2.MySQL中的数据管理 五、索引的理解1.索引案例2.单页mysql page3.管…

ts学习01-开发环境搭建

环境 nodejs 18 npm 安装typescript npm install typescript # 如果上面太慢,可以执行下面的方法 npm install typescript --registryhttps://registry.npm.taobao.orgHelloWorld 新建index.ts console.log("hello ts");执行下面命令进行编译 npx t…

【ArcGIS Pro二次开发】(74):Python、C#实现Excel截图导出图片

以村庄规划制图为例,通过对现状和规划用地的统计,生成Excel格式的【空间功能结构调整表】后,需要进一步将表格导出成图片,并嵌入到图集中,这样可以实现全流程不用手动参与,让制图的流程完全自动化。 关于E…

5G技术的应用和发展

一、什么是5G技术 5G技术是第五代移动通信技术的缩写,是一项全新的高速无线通信技术,它可以提供更高的带宽和更低的延迟,以实现更快的数据传输和更好的用户体验。5G技术的主要特点包括更高的数据传输速率、更低的延迟、更大的网络容量、更好…

Go 语言循环语句

文章目录 1. for 循环:2. for 循环的无限循环形式:3. range 循环:4. while 循环模拟:5. do-while 循环模拟:6. 循环控制语句 Go语言提供了多种循环语句,用于重复执行一段代码块。以下是Go语言中常用的循环语句: 1. for 循环: #mermaid-svg-iLHuj1pKeODq…

Drogon源码剖析

一、Drogon介绍 Drogon是一个基于C的跨平台HTTP应用程序框架,它支持Linux,也支持macOS、FreeBSD,OpenBSD,HaikuOS,和Windows。项目地址:https://github.com/drogonframework/drogon。 它的主要特点如下&a…

OpenAI 组建安全 AGI 新团队!应对AI“潘多拉魔盒”

夕小瑶科技说 原创 作者 | 小戏 一旦谈及未来 AI,除了天马行空的科幻畅想,不可避免的也有未来 AI 时代的末日预言。从 AI 武器化到 AI 欺骗,从邪恶 AI 到 AI 掌权,人工智能,尤其是通用人工智能的风险始终都清清楚楚的…

Dockerfile + 源码安装httpd 制作镜像

Dockerfile 源码安装httpd 制作镜像 环境: 虚拟机版本ip部署应用centos8192.168.136.142docker [rootlocalhost ~]# ls anaconda-ks.cfg httpd [rootlocalhost httpd]# cat dockerfile FROM centosRUN rm -rf /etc//yum.repos.d/* && \curl -o /etc/y…

Mac电脑录屏软件 Screen Recorder by Omi 中文最新

Screen Recorder by Omi是一款屏幕录制软件,它可以帮助用户轻松地录制屏幕活动,并将其保存为高质量的视频文件。 该软件提供了多种录制选项,包括全屏录制、选择区域录制和单窗口录制等,同时提供了丰富的设置选项,如视…

Pycharm中新建一个文件夹下__init__.py文件有什么用

在PyCharm中新建一个文件夹下的__init__.py文件有以下几个作用: 声明文件夹为一个Python包:__init__.py文件的存在告诉Python解释器该文件夹是一个Python包。当你导入该文件夹下的模块时,Python会将其视为一个包而不是普通的文件夹。这允许你…

为什么要停止在 SpringBoot 中使用字段注,改用构造器注入

停止在 SpringBoot 中使用字段注入! 本文为翻译文,同时加入了一些自己的理解,翻译来源:https://medium.com 在 Spring Boot 依赖项注入的上下文中,存在关于注入依赖项最佳实践的争论:字段注入、Setter注入和构造函数…

SparkML

SparkML SparkML_lr_train :读取py处理后的train表用于训练,将训练模型保存好。 SparkML_lr_predict :读取训练好的模型,读取py处理后的test表用于预测。将预测结果写入normal_data中,根据id修改stream_is_normal的值。…

深入理解JVM虚拟机第十六篇:虚拟机栈存储结构和运行原理

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JavaScript 本文章简介:话不多说,让我们讲清楚虚拟机栈存储结构和运行原理…

LabVIEW实现变风量VAV终端干预PID控制

LabVIEW实现变风量VAV终端干预PID控制 变风量(VAV)控制方法的研究一直是VAV空调研究的重点。单端PID控制在温差较大时,系统容易出现过冲。针对空调终端单端PID控制的不足,设计一种干预控制与PID控制耦合的控制方法。项目使用LabV…

23个优秀开源免费BI仪表盘

BI也称为商业智能,是收集、分析和展示数据以支持决策者做出明智的业务决策的过程。BI帮助组织将其原始的生产数据转化为有意义的见解或者知识,以推动其业务战略。BI能够为组织改善决策、提高效率和提升资源利用率。 BI仪表盘是BI系统的重要组成部分&…

【计算机网络】数据链路层-MAC和ARP协议

文章目录 1. 认识以太网2. MAC协议MAC帧的格式MAC地址和IP地址的区别MTU 3. 局域网通信原理碰撞检测和避免 4. ARP协议ARP数据报的格式ARP缓存 1. 认识以太网 网络层解决的是跨网络点到点传输的问题,数据链路层解决的是同一网络中的通信。 数据链路层负责在同一局域…

python多进程(二)一些基础属性和方法

import multiprocessing# 定义一个任务函数 def worker(num):print(fWorker {num} started)# 这里可以执行具体的任务逻辑# ...# 创建多个进程 if __name__ __main__:processes []for i in range(5):p multiprocessing.Process(targetworker, args(i,))processes.append(p)p…