首页
学习
活动
专区
工具
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

Springbean作用域与生命周期

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

80220
  • 谈谈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",即默认情况下,会在启动容器时(即实例化容器时)时实例化。

    55641

    Spring】——Spring生命周期

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

    16520

    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类公共方法。

    77510

    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是一样

    46320

    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: /* SpringSingleton Bean是否为单例模式???...较为灵活构建产品对象 2. 执行最后build方法之前,产品对象均不可用 3.

    42020

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

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

    66110

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

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

    52930

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

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

    51080

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

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

    11710

    简单介绍一下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...SpringBean对象销毁是由Bean对象作用域配置来决定: 1、singleton 作用域对象可以容器关闭时会由Spring调用对象销毁资源方法来销毁Bean对象; 2、prototype

    35110

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

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

    30410

    SpringBoot 通过SpringApplication 引导启动

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

    17710

    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包。 <!

    50730

    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包。 <!

    38740

    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类将其注册到容器。

    85310
    领券