返回顶部
首页 > 资讯 > 后端开发 > Python >Springboot如何获取上下文ApplicationContext
  • 437
分享到

Springboot如何获取上下文ApplicationContext

2024-04-02 19:04:59 437人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录SpringBoot获取上下文ApplicationContextspringboot的应用上下文ServletWEBServerApplicationContext扩展的功能A

Springboot获取上下文ApplicationContext

项目中遇到了一个场景,就是通过获得上下文然后获取特定的bean。在此遇到了不小的坑,故留下这个篇文章,做个记录。


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
@Component
public class SprinGContextUtil implements ApplicationContextAware {
    
    private static ApplicationContext applicationContext;
 
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
 
    
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
 
    
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }
 
    
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }
 
    
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}

看上面的代码,可以看到在工具类中一开始是声明了一个ApplicationContext类型的静态变量,但是由于静态变量是不能被Spring容器管理的,一开始用正常的getter和setter方法不能获取到特定的bean,实践证明,需要在此变量的setter方法上加上@Autowired注解,并且去除setter方法中的static关键字。才可实现特定bean的注入。

springboot的应用上下文

springboot上下文有两个

  • ServletWebServerApplicationContext
  • AnnotationConfigServletWebServerApplicationContext(继承上面)

ServletWebServerApplicationContext

该类属于spring-boot-2.1.1Release.jar中,是自springboot诞生就衍生出来的,是spring框架的应用上下文Application的子类。

多说无益,show me code

扩展的功能

首先让我们来看一下,这个类到底做了什么,有什么存在的价值?


    private volatile WebServer webServer;
 @Override
 protected void onRefresh() {
  super.onRefresh();
  try {
   createWebServer();
  }
  catch (Throwable ex) {
   throw new ApplicationContextException("Unable to start web server", ex);
  }
 }

在此类中有个WebServer成员变量,让我们用脚趾头想一下也应该可以知道,这其实就是web服务对象,也基本上可以猜测就是跟Tomcat相关了(当然也可以是其他web服务器,如jetty)

然后我们又发现了onRefresh方法,相信我们并不陌生,这就是spring核心refresh方法的中一个钩子方法(即表明此时已经加载所有配置bean),进行WebServer对象的创建


 @Override
 protected void finishRefresh() {
  super.finishRefresh();
  WebServer webServer = startWebServer();
  if (webServer != null) {
   publishEvent(new ServletWebServerInitializedEvent(webServer, this));
  }
 }

我们又发现该类存在finishRefresh,仔细想一下,这个也是spring核心#refresh方法中的一个钩子方法(不过这个特别,因为该方法是refresh方法中的最后一步,即会去实例化spring容器中的所有beandefinition对象)

首先赞一个,这个很巧妙,调用了super.finishRefresh() ,并没有丢弃父类的逻辑功能(这点在多态中,我相信还是会有人犯错,本来是扩展功能,但是直接重写,丢弃了父类的方法,当然spring框架开发大佬肯定不会犯这种错误,对吧!)

第二点重点来了,就是startWebServer,也就是在spring完成实例化之后,就会去启动web服务。

AnnotationConfigServletWebServerApplicationContext

小结一下:

首先此类是springboot启动运行run()创建ApplicationContext的实现类,不过很可惜,该类并没有很强的实质性扩展。

**唯一作用就是拥有了通过注解加载配置类的作用,即和AnnotationConfigApplication一样,只不过springboot的运行启动已经是通过注解加载bean类**

(虽然是鸡肋,不过这也符合spring创建类的一贯风格,就是每个类都是高内聚的,即每个类除了父类的功能之外,还都拥有其他扩展的作用。即使创建出来还没有用到就被遗弃,但仍然不能阻止spring开发大佬创建该类,哈哈)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Springboot如何获取上下文ApplicationContext

本文链接: https://lsjlt.com/news/157872.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Springboot如何获取上下文ApplicationContext
    目录Springboot获取上下文ApplicationContextspringboot的应用上下文ServletWebServerApplicationContext扩展的功能A...
    99+
    2024-04-02
  • springboot如何获取applicationContext servletContext
    目录springboot获取applicationContext servletContext网上的其他方式配置解决办法看源码总结springboot获取applicationCon...
    99+
    2023-01-12
    springboot applicationContext servletContext springboot applicationContext springboot servletContext
  • Springboot 如何获取上下文对象
    目录Springboot上下文对象获取或者更简单的写法:spring boot获取上下文 随时取出被spring管理的bean对象方法一:方式二:Springboot上下文对象获取 ...
    99+
    2024-04-02
  • SpringBoot如何使用ApplicationContext获取bean对象
    目录使用ApplicationContext获取bean对象SpringBoot Bean注入的深入研究下面代码可正常运行下面代码不能正常运行比较解决方案应用使用Applicatio...
    99+
    2024-04-02
  • 获取Spring的上下文环境ApplicationContext的最简单方式
    目录获取Spring上下文环境ApplicationContext分析:正确的做法是:注意:Spring上下文(ApplicationContext)理解什么是Spring应用上下文...
    99+
    2024-04-02
  • SpringBoot怎么使用ApplicationContext获取bean对象
    小编给大家分享一下SpringBoot怎么使用ApplicationContext获取bean对象,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用ApplicationContext获取bean对象编写一个Applica...
    99+
    2023-06-25
  • springboot如何获取文件流
    目录springboot获取文件流前端获取springboot返回的文件流的踩坑踩过坑的我给您提供一个答案两种解决方案springboot获取文件流 在日常开发中,经常会获取项目的相...
    99+
    2024-04-02
  • SpringBoot如何获取src/main/resource路径下的文件
    目录SpringBoot获取src/main/resource路径下的文件SpringBoot打成jar包后,读取resources目录下的文件一般方法正确方法SpringBoot获...
    99+
    2024-04-02
  • 详解在SpringBoot应用中获取应用上下文方法
    定义上下文工具类:package com.alimama.config;import org.springframework.context.ApplicationContext;public class SpringContextUtil...
    99+
    2023-05-31
    spring boot 上下文
  • shell下如何获取上一个月
    这篇文章主要介绍了shell下如何获取上一个月,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下所示:#!/bin/bash#一月前historyTime=$(date&nb...
    99+
    2023-06-09
  • SpringBoot如何读取Resource下文件
    这篇文章给大家分享的是有关SpringBoot如何读取Resource下文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SpringBoot读取Resource下文件最近在项目中涉及到Excle的导入功能,通常...
    99+
    2023-06-20
  • SpringBoot 如何读取classpath下的文件
    SpringBoot 读取classpath下文件 开发过程中,必不可少的需要读取文件,对于打包方式的不同,还会存在一些坑,比如以jar包方式部署时,文件都存在于jar包中,某些读取...
    99+
    2024-04-02
  • springboot如何读取resources下的文件
    今天小编给大家分享一下springboot如何读取resources下的文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项...
    99+
    2023-07-02
  • java如何获取resources下的文件
    在Java中,可以使用`ClassLoader`类来获取`resources`下的文件。具体步骤如下:1. 创建`ClassLoad...
    99+
    2023-09-28
    java
  • Laravel如何获取上一篇和下一篇文章数据
    今天小编给大家分享一下Laravel如何获取上一篇和下一篇文章数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先文章的起...
    99+
    2023-07-04
  • springboot如何获取接口下所有实现类
    目录springboot获取接口下所有实现类springboot动态调用实现类1、添加接口2、创建实现类3、获取实现类的相关接口 springboot获取接口下所有实现类 ...
    99+
    2024-04-02
  • antdupload上传如何获取文件宽高
    目录antd upload上传获取文件宽高antd上传文件限制大小 react Hooks总结antd upload上传获取文件宽高 项目新加的需求,需要判断上传图片的宽高,查了一下...
    99+
    2023-02-12
    antd upload上传 upload获取文件宽高 antd upload
  • java如何获取上传文件大小
    在Java中,可以通过使用`File`类或`MultipartFile`类来获取上传文件的大小。1. 使用`File`类获取文件大小...
    99+
    2023-08-23
    java
  • springboot如何获取yml的值
    在Spring Boot中,可以通过在配置文件(如application.yml)中定义属性值,然后在Java代码中使用@Value...
    99+
    2024-04-02
  • SpringBoot怎样获取src/main/resource路径下的文件
    SpringBoot怎样获取src/main/resource路径下的文件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SpringBoot获取src/main...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作