如何手动获取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;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        this.servletcontext = sce.getServletContext();
    }

    public ApplicationContext getApplicationcontext() {
        return WebApplicationContextUtils.getWebApplicationContext(this.servletcontext);
    }
}

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

  	@Autowired
    private 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;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationcontext) throws BeansException {
        this.applicationcontext = applicationcontext;
    }

    public ApplicationContext getApplicationcontext() {
        return this.applicationcontext;
    }
}

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


	@Autowired
    private 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容器

	@Autowired
    private 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容器

	@Autowired
    private 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

临界资源,临界区,通信的干扰问题(互斥),信号量(本质,上下文切换问题,原子性,自身的安全性,操作)

目录 引入 概念 临界资源 临界区 干扰存在原因 互斥 信号量 引入 举例 概念 介绍 表示可用资源数 表示等待进程数 申请信号量 信号量的本质 全局变量? 共享内存? 不安全问题 -- 上下文切换 原子性 信号量自身的安全性 原子操作的意义 操作 引入 通信…

Cesium 相机设置

1.setView 直接跳转到目的地 // 设置相机位置 const position Cesium.Cartesian3.fromDegrees(113, 31, 20000); // setView通过定义相机目的地(方向),直接跳转到目的地 viewer.camera.setView({ destination: position, // 位置设置 orientation: { //…

适合汽车音频系统的ADAU1977WBCPZ、ADAU1978WBCPZ、ADAU1979WBCPZ四通道 ADC,24-bit,音频

一、ADAU1977WBCPZ 集成诊断功能的四通道ADC,音频 24 b 192k IC,SPI 40LFCSP ADAU1977集成4个高性能模数转换器(ADC),其直接耦合输入具有10 V rms性能。该ADC采用多位Σ-Δ架构,其连续时间前端能够实现低EMI性能。它可以直接连接…

专业135总分400+西安交通大学信息与通信工程学院909/815考研经验分享

今年初试发挥不错,400,专业课135,将近一年复习一路走来,感慨很多,希望以下经历可以给后来的同学提供一些参考。 初试备考经验 公共课:三门公共课,政治,英语,数学。在备考…

GaN HEMT 电容的分析建模,包括寄生元件

标题:Analytical Modeling of Capacitances for GaN HEMTs, Including Parasitic Components 来源:IEEE TRANSACTIONS ON ELECTRON DEVICES(14年) 摘要:本文提出了一种基于表面势的终端电荷和电容模型,包…

直接插入排序与希尔排序

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

4.移位计算,乘除法运算

目录 一. 移位计算 (1)算数移位 (2)逻辑移位 (3)循环移位 二. 乘法运算 (1)原码的乘法运算 (2)补码的乘法运算 三. 除法运算 (1&#xf…

SpringDataJpa(二)

三、Spring Data JPA概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring D…

Python爬虫-获取汽车之家车家号

前言 本文是该专栏的第9篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cHM6Ly9jaGVqaWFoYW8uYXV0b2hvbWUuY29tLmNuL0F1dGhvcnMjcHZhcmVhaWQ9MjgwODEwNA== 需求:获取汽车之家车家号数据 笔者将在正文中介绍详细的思路以及采集方法,废话不多说,跟着笔者直接往…

GPT-4V:AI在教育领域的应用

OpenAI于9月25日发布了最新的GPT-4V模型,为ChatGPT引入了语音和图像功能,为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验,用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…

React 其他常用Hooks

1. useImperativeHandle 在react中父组件可以通过forwardRef将ref转发到子组件;子组件拿到父组件创建的ref,绑定到自己的某个元素; forwardRef的做法本身没有什么问题,但是我们是将子组件的DOM直接暴露给了父组件,某下…

设计模式之组合模式-创建层次化的对象结构

目录 概述概念主要角色应用场景 组合模式的实现类图NS图基本代码组合模式的精髓意外收获(❀❀) 应用示例-公司组织架构管理需求结构图代码 组合模式的优缺点优点缺点 总结 概述 概念 组合模式是一种结构型设计模式,它允许将对象组合成树形结…

虚幻5.1 常见的效果关闭方式

常见的虚幻效果关闭方式 1.Bloom ProjectSettings->Rendering->Default Settings->Bloom PostProcessVolume->Lens->Bloom 2.Ambient Occlusion/Screen Space Ambient Occlusion(SSAO) ProjectSettings->Rendering->Default Settings->Ambient Occl…

服务器部署 Nacos 获取不到配置浏览器可以访问

服务器部署 Nacos 获取不到配置浏览器可以访问 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳&#xff0c…

基于springboot vue mysql的在线拍卖系统 全套代码 全套文档

基于SpringBoot的在线拍卖系统,springboot vue mysql (毕业论文10168字以上,共34页,程序代码,MySQL数据库) 代码下载链接:https://pan.baidu.com/s/104LjKF7kvhYeooSBk9h65g?pwd8fk4 提取码:8fk4 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue 【技…

【每日一题】318. 最大单词长度乘积-2023.11.6

题目: 318. 最大单词长度乘积 给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。 示例 1: 输入&#xff1…

模拟ASP.NET Core MVC设计与实现

前几天有人在我的《ASP.NET Core框架揭秘》读者群跟我留言说:“我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你能不能按照《200行代码,7个对象——让你了解ASP.…

第26期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

【Git】快速入门安装及使用git与svn的区别常用命令

一、导言 1、什么是svn? SVN是Subversion的简称,是一个集中式版本控制系统。与Git不同,SVN没有分布式的特性。在SVN中,项目的代码仓库位于服务器上,团队成员通过向服务器提交和获取代码来实现版本控制。SVN记录了每个文…