首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在不使用Singleton的情况下从非bean对象获取Spring Application上下文

在不使用 Singleton 的情况下从非 bean 对象获取 Spring Application 上下文,可以通过以下几种方法实现:

  1. 使用 ApplicationContextAware 接口:

在 Spring 中,可以通过实现 ApplicationContextAware 接口来获取 ApplicationContext。首先,创建一个类并实现 ApplicationContextAware 接口,然后在 setApplicationContext 方法中保存 ApplicationContext 的引用。

代码语言:java
复制
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        context = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return context;
    }
}

然后,在需要使用 ApplicationContext 的类中,可以通过调用 ApplicationContextProvider 的 getApplicationContext 方法来获取 ApplicationContext。

代码语言:java
复制
import org.springframework.context.ApplicationContext;

public class NonBeanClass {

    public void someMethod() {
        ApplicationContext context = ApplicationContextProvider.getApplicationContext();
        // 使用 ApplicationContext 进行后续操作
    }
}
  1. 使用 WebApplicationContextUtils 类:

在 Web 应用程序中,可以使用 WebApplicationContextUtils 类来获取 WebApplicationContext。该类提供了一个静态方法,可以根据 ServletContext 对象获取 WebApplicationContext。

代码语言:java
复制
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class NonBeanClass {

    public void someMethod(ServletContext servletContext) {
        WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        // 使用 WebApplicationContext 进行后续操作
    }
}
  1. 使用 ApplicationListener 监听 ContextRefreshedEvent 事件:

在 Spring 中,可以通过实现 ApplicationListener 接口并监听 ContextRefreshedEvent 事件来获取 ApplicationContext。首先,创建一个类并实现 ApplicationListener 接口,然后在 onApplicationEvent 方法中保存 ApplicationContext 的引用。

代码语言:java
复制
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public class ApplicationContextListener implements ApplicationListener<ContextRefreshedEvent> {

    private static ApplicationContext context;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        context = event.getApplicationContext();
    }

    public static ApplicationContext getApplicationContext() {
        return context;
    }
}

然后,在需要使用 ApplicationContext 的类中,可以通过调用 ApplicationContextListener 的 getApplicationContext 方法来获取 ApplicationContext。

代码语言:java
复制
import org.springframework.context.ApplicationContext;

public class NonBeanClass {

    public void someMethod() {
        ApplicationContext context = ApplicationContextListener.getApplicationContext();
        // 使用 ApplicationContext 进行后续操作
    }
}

总之,在不使用 Singleton 的情况下从非 bean 对象获取 Spring Application 上下文,可以通过以上几种方法实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在spring项目里面,通过上下文类ApplicationContext 获取到我们想要的bean对象,而不是注解获取

目录 1 问题 2 写一个工具类 3 使用工具类 1 问题 我们的spring项目,一般bean对象的创建,就是靠注解,但是我现在想要在代码里面,不是使用注解获取到bean对象,而是在上下文对象里面获取到...bean对象,我们都知道,我们的项目一起动,就扫描注解,让被注解的类,创建bean对象,放到spring容器里面,之后就是从容器里面获取到对象,所以获取的时候,我们就可以这样获取 2 写一个工具类 import...Component public class ApplicationContextUtils implements ApplicationContextAware { /** * 上下文对象实例...Spring上下文 * * @return */ public static ApplicationContext getApplicationContext()...singleController = applicationContext.getBean("eeeController"); System.out.println(singleController); 以上就可以获取到我们想要的类对象

1.4K10

Spring中bean的作用域与生命周期

在 Spring 中,那些组成应用程序的主体及由 Spring IoC 容器所管理的对象,被称之为 bean。...Singleton 是单例类型,就是在创建起容器时就同时自动创建了一个 bean 的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。...Prototype 是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取 bean 的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。...其实 Spring 的 Aware 接口是 Spring 设计为框架内部使用的,在大多数情况下,我们不需要使用任何Aware接口,除非我们真的需要它们,实现了这些接口会使应用层代码耦合到 Spring...其实很多时候我们并不会真的去实现上面所描述的那些接口,那么下面我们就除去那些接口,针对 bean 的单例和非单例来描述下 bean 的生命周期: 单例管理的对象 当 scope="singleton",

81720
  • 谈谈Spring bean的生命周期,作用域

    目录1、bean的作用域2、bean的生命周期2.1 单例管理的对象2.2 非单例管理的对象**2.3 引申 ​ 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,...Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。...Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。...(5)当一个bean的作用域为Global Session,表示在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。...bean的生命周期:2.1 单例管理的对象  当scope="singleton",即默认情况下,会在启动容器时(即实例化容器时)时实例化。

    56741

    【Spring】——Spring生命周期

    使用 Singleton 模式的主要目的是确保在一个应用程序中,某个类的对象只有一个,这样可以节省系统资源,避免 对同一数据的多重处理等问题。...描述:该作用域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过 applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同一个对象...也就是说,每个HTTP请求都有自己的bean实例,该实例是在单个bean定义的后面创建的。只在具有web感知的Spring ApplicationContext上下文中有效。...单例作用域(singleton) VS 全局作用域(application) singleton 是 Spring Core 的作用域;application 是 Spring Web 中的作用域; singleton...将 bean 从 spring 读取出来,装配到相应的类。 2、Bean的生命周期  所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。

    17520

    Spring框架参考手册_5.0.0_中英文对照版_Part II_3.5

    只在感知Spring ApplicationContext的上下文中有效。application单个bean定义的创建实例的作用域为ServletContext的生命周期。...只在感知Spring ApplicationContext的上下文中有效。...从Spring 3.0,引入了thread scope作用域,但默认情况下是不注册的。更多的信息请看SimpleThreadScope文档。...因此,虽然不管什么作用域初始化生命周期回调函数都会在所有对象上调用,但是在原型作用域的情况下,不会调用配置的销毁生命周期回调函数。客户端代码必须清理原型作用域的对象并释放原型bean拥有的昂贵资源。...下面的例子使用Spring包含的SimpleThreadScope,但默认是不注册的。这个用法说明与你自己的定制Scope是一样的。

    46920

    Spring5参考指南:Bean作用域

    在Spring中,有六个作用域。分别是singleton,prototype,request,session,application,websocket。...Spring里面的Singleton作用域表明这个定义的bean在整个Spring容器中只有一个实例。任何对这个bean的请求都会返回这个唯一的实例。...在Spring容器中,如果一个bean被定义为Prototype,那么,每次通过getBean()方法来获取这个bean都会返回一个新的bean实例。 下图说明了prototype作用域: ?...也就是说,你需要插入一个代理对象,该对象与被代理的对象公开相同的公共接口,但该对象可以从相关作用域(如HTTP请求)中获取到实际的目标对象,并将方法调用委托给实际对象。...一般来说Spring的会使用CGLIB的代理。但是要注意,CGLIB只会代理非final类的公共方法。

    78310

    【Spring Boot】Spring 魔法世界:Bean 作用域与生命周期的奇妙之旅

    ️1.Bean的作用域 1.1概念 在Spring IoC&DI阶段, 我们学习了Spring是如何帮助我们管理对象的. 1....包中进行测试使用的,所以需要注入applicationcontext类,获取spring上下文(获取spring容器),再拿到这里对象; 此时我们再次拿对象,然后进行两次对象获取打印对应的地址发现: 地址是一样的..., 说明每次从Spring容器中取出来的对象都是同⼀个.这也是"单例模式" 单例模式: 确保⼀个类只有⼀个实例,多次创建也不会创建出多个实例 默认情况下, Spring容器中的bean都是单例的, 这种...在⼀个web容器中ApplicationContext可以有多个 ️2.Bean的生命周期 2.1概念以及分类 ⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程, 我们把这个过程就叫做⼀个对象的⽣...,在执行后,判断如果该实例为非空的,那么直接返回这个实例,不再执行下面实例化的创建过程; 2.3.3创建Bean的实例 在上述解析和实例化处理后,就开始执行实例的创建工作了,主要的方法就是doBeanCreate

    10210

    Spring面试点汇总

    ,a dependsOn b就是b先创建后a再创建 第四阶段 第四阶段作用: 根据Scope创建bean 第四阶段注意点: scope理解为从xxx范围中寻找bean singleton scope 表示从单例池范围内获取...bean,如果没有,则创建并放入单例池 prototype scope 表示从不缓存bean,每次创建新对象 request scope 表示从request对象范围内获取bean,如果没有就创建并放入...注解的类生效,并且将该类注入到 IOC 容器中一同管理 @ConfigurationProperties:标注在Class上,这样SpringBoot就会从Environment中获取属性对应的属性值将其注入...pattern 下面我们介绍Spring所使用的设计模式 Singleton 单例模式Singleton: /* Spring中的Singleton Bean是否为单例模式???...较为灵活的构建产品对象 2. 在不执行最后build方法之前,产品对象均不可用 3.

    42220

    别再找了,这就是全网最全的SpringBean的作用域管理!

    有如下优点: 可以控制要插入到从特定 BeanDefinition 创建的对象中的各种依赖项和配置值 可以控制从特定 BeanDefinition 创建的对象的作用域。...singleton 是单例类型(对应于单例模式),就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,但我们可以指定Bean节点的 lazy-init=”true” 来延迟初始化bean...每次获取到的对象都是同一个对象。注意,singleton 作用域是Spring中的缺省作用域。...prototype 是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。...但请记住,你无法在Web应用程序上下文中使用它们(说个好理解点的,就是一个函数内部自定义变量所在的作用域,函数执行完就销毁了,没有什么逃逸)。

    53030

    别再找了,这就是全网最全的SpringBean的作用域管理!

    有如下优点: 可以控制要插入到从特定 BeanDefinition 创建的对象中的各种依赖项和配置值 可以控制从特定 BeanDefinition 创建的对象的作用域。...singleton 是单例类型(对应于单例模式),就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,但我们可以指定Bean节点的 lazy-init=”true” 来延迟初始化bean...每次获取到的对象都是同一个对象。注意,singleton 作用域是Spring中的缺省作用域。...prototype 是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。...但请记住,你无法在Web应用程序上下文中使用它们(说个好理解点的,就是一个函数内部自定义变量所在的作用域,函数执行完就销毁了,没有什么逃逸)。

    67810

    Spring(一):Spring相关知识介绍笔记

    4、Srping生命周期1、实例化Bean也就是我们经常使用的new方法;2、按照Spring上下文对实例化的Bean进行配置(IOC注入);3、Bean实现BeanNameAware接口,会调用它实现的...(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);5、Bean已经实现ApplicationContextAware...Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。...Bean了,那这个Bean属于Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton。...4.1、非侵入式设计Spring属于非侵入式(non-invasive)框架,它使应用程序代码对框架的依赖程度最小。

    53980

    Java核心知识点整理大全12-笔记

    定义了允许在运行期间向容器注册单实例 Bean 的方法;对于单实例( singleton)的 Bean 来说,BeanFactory 会缓存 Bean 实例,所以第二次使用 getBean() 获取 Bean...时将直接从 IoC 容器的缓存中获取 Bean 实例。...在应用上下文关闭的情况下调用 refresh()即可启动应用上下文,在已经启动 的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用 close()则可关闭应用 上下文。...,每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建 一个新的 Bean 实例,每个 Bean 实例都有自己的属性和状态,而 singleton 全局只有一个对 象...根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton 作用域。

    12410

    Spring高手之路4——深度解析Spring内置作用域及其在实践中的应用

    在5.x版本中,Spring内置了六种作用域: singleton:在IOC容器中,对应的Bean只有一个实例,所有对它的引用都指向同一个对象。...这个问题我发现在原型作用域这个点还需要再补充讲解一下:   这种情况在没有相互依赖的情况下不会有问题,Spring会在先解析配置类和@Bean方法,获得所有Bean的依赖信息,之后Spring根据依赖关系决定...如果在同一个请求中多次获取该Bean,就会得到同一个实例,但是在不同的请求中获取的实例将会不同。...也就是说,从用户登录开始,到用户退出登录(或者Session超时)结束,这个过程中,不管用户进行了多少次HTTP请求,只要是在同一个会话中,都会使用同一个Bean实例。...6. application作用域(了解) application作用域:在整个Web应用的生命周期内,Spring容器只会创建一个Bean实例。

    34010

    简单介绍一下spring bean的生命周期_我国女性劳动参与率

    实现 *Aware 接口 *Aware 接口可以用于在初始化 bean 时获得 Spring 中的一些对象,如获取 Spring 上下文 等。...Spring Bean对象的作用域: 在Spring容器中管理的Bean对象,可以在声明时通过scope属性或者相关注解指定其作用域 在Spring容器中,Bean对象的作用域一共有5种:singleton...singleton属于单例模式,被singleton标识的对象具备全局唯一性,也就是在整个spring的容器中有且仅有一个该Bean的实例。 singleton的 配置文件如下: 在Spring框架应用中,所有的Bean对象都有生命周期,就是指Bean对象的创建,初始化,服务,销毁的这个过程,我们称之为Bean对象的生命周期; 在Spring配置文件中,我们可以通过配置init-method...在Spring中Bean对象的销毁是由Bean对象的作用域的配置来决定的: 1、singleton 作用域的对象可以在容器关闭时会由Spring调用对象的销毁资源的方法来销毁Bean对象; 2、prototype

    35110

    SpringBoot 通过SpringApplication 引导启动

    相关环境) 从工程环境中决定主入口的类 run()——开始引导启动 new StopWatch()——创建计时器 StopWatch是springframework.util中提供的一个工具类,在启动过程中使用...createApplicationContext()——创建应用程序上下文并加载Bean 在准备好环境之后,接下来要做的就是创建应用程序上下文ApplicationContext对象。...refreshContext()——刷新上下文 在应用程序上下文准备好后,可以通过刷新应用程序上下文发现Bean并加载到容器中。...对于Scope是Singleton的Bean而言,此时已经具备了实例化Bean的条件,因此在这一步中,Spring会对所有Singleton且非lazy-init的Bean进行实例化。...主要做法就是获取容器中所有为singletion且非lazyInit的BeanDefinition,然后通过getBean创建出Bean的实例,保存在容器内部。

    19410

    ssm框架过时了吗_spring实战

    (String[] args) { //获取Spring的上下文对象 ClassPathXmlApplicationContext context = new...注意 所有的Bean一注册进来的时候就已经被Spring实例化了,从Spring中那同一类型的实例的不同对象其实指向的是同一个对象。...其余的request,session,application这些个只能在web开发中使用 Bean的自动装配 自动装配是Spring满足bean依赖的一种方式 Spring会在上下文中自动寻找,并自动给...-- byName:会自动在容器上下文中查找,和自己对象Set方法后面的值对应的beanid! byTaoe:会自动在容器上下文中查找,和自己对象属性类型相同的bean!...如果两个都找不到的情况下,就报错![常用] 执行顺序不同 @Autowired通过byType的方式实现 使用注解开发 Spring4之后,使用注解开发,就要导入aop包。 <!

    51430

    SSM-Spring(1)「建议收藏」

    (String[] args) { //获取Spring的上下文对象 ClassPathXmlApplicationContext context = new...注意 所有的Bean一注册进来的时候就已经被Spring实例化了,从Spring中那同一类型的实例的不同对象其实指向的是同一个对象。...其余的request,session,application这些个只能在web开发中使用 Bean的自动装配 自动装配是Spring满足bean依赖的一种方式 Spring会在上下文中自动寻找,并自动给...-- byName:会自动在容器上下文中查找,和自己对象Set方法后面的值对应的beanid! byTaoe:会自动在容器上下文中查找,和自己对象属性类型相同的bean!...如果两个都找不到的情况下,就报错![常用] 执行顺序不同 @Autowired通过byType的方式实现 使用注解开发 Spring4之后,使用注解开发,就要导入aop包。 <!

    27840

    ssm框架过时了吗_spring源码

    (String[] args) { //获取Spring的上下文对象 ClassPathXmlApplicationContext context = new...注意 所有的Bean一注册进来的时候就已经被Spring实例化了,从Spring中那同一类型的实例的不同对象其实指向的是同一个对象。...其余的request,session,application这些个只能在web开发中使用 Bean的自动装配 自动装配是Spring满足bean依赖的一种方式 Spring会在上下文中自动寻找,并自动给...-- byName:会自动在容器上下文中查找,和自己对象Set方法后面的值对应的beanid! byTaoe:会自动在容器上下文中查找,和自己对象属性类型相同的bean!...如果两个都找不到的情况下,就报错![常用] 执行顺序不同 @Autowired通过byType的方式实现 使用注解开发 Spring4之后,使用注解开发,就要导入aop包。 <!

    39040

    Spring系列四:Bean Scopes作用域

    概述 在Spring框架中,我们可以在六个内置的spring bean作用域中创建bean,还可以定义bean范围。...Spring Bean作用域类型 在Spring中,可以使用spring中的 @Scope注解定义bean的作用域。下面我们已经列出这六个在Spring应用程序上下文中使用的内置bean作用域。...这些相同的作用域也适用于spring boot bean作用域。 SCOPE 描述 singleton spring IoC容器存在一个bean对象实例。...即: 应用程序作用域bean是每个ServletContext的单例对象,而单例作用域bean是每个ApplicationContext的单例对象。请注意,单个应用程序可能有多个应用程序上下文。...自定义线程作用域 Spring还使用类SimpleThreadScope提供了非默认线程作用域。若要使用此作用域,必须使用CustomScopeConfigurer类将其注册到容器。

    86810
    领券