当前位置: 首页 > 知识库问答 >
问题:

ApplicationContext关闭后Springbean会发生什么情况

龙佐
2023-03-14

假设我有一个普通的应用程序,其中我正在使用ApplicationContext ApplicationContext=new FileSystemXmlApplicationContext(“bean.xml”)创建一个Spring应用程序上下文

现在,假设在这个bean.xml有Spring beanBean1的bean定义,所以当我创建应用程序上下文时,Spring容器将为这个Bean1实例化和初始化一个对象。

然后我有一个非Spring对象,它保存着对这个Spring bean的对象的引用。

现在,假设我使用appCtx关闭了应用程序上下文(ConfigurableApplicationContext)。关闭()

现在我的问题是:

  1. 这个Spring beanBean1的对象会发生什么,一旦Spring的Application ationContext关闭,它会被垃圾收集吗?
  2. 由于我持有对这个Spring beanBean1的对象的引用,我仍然拥有这个对象还是指向这个的对象引用变量将变为NULL?

共有2个答案

彭礼骞
2023-03-14

Application Context在引擎盖下使用HashMap来存储bean,如果您在上面调用关闭(),它将在这些HashMap上调用Clear()方法。正如您所知,当我们在HashMap上调用Clear()方法时,它只将null分配给map条目,因此如果有另一个对象引用这些对象,它们将存活。

所以你的问题是:

  1. 否,因为Bean1还有另一个参考
  2. 你仍然拥有它
双子民
2023-03-14

它似乎不会为空。

我有一个接口Coach和实现它的类TrackCoach,它有一个名为

getDailyWorkout();

我正在使用getBean()从容器中对bean进行基本调用

这是一节主要课

public static void main(String[] args) {
    
    //load spring configuration file
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    // retrieve bean from spring container
    Coach theCoach = context.getBean("myCoach", Coach.class);
    //call methods on bean
    System.out.println(theCoach.getDailyWorkout());
    Object o = new Object();
    o = theCoach;
    System.out.println("this is Object before closing> "+o);
    //close context
    System.out.println("Closing context");
    context.close();
    System.out.println("After closing context");
    System.out.println("this is a regular usage of bean reference> "+theCoach.getDailyWorkout());
    System.out.println("this is Object AFTER closing> "+o);
    Coach c = (Coach) o;
    
    System.out.println("this is AFTER CASTING> "+c.getDailyWorkout());

}

输出如下

    Jun 09, 2022 6:36:00 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6d9c638: startup date [Thu Jun 09 18:36:00 CEST 2022]; root of context hierarchy
Jun 09, 2022 6:36:00 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
    Run for 20 min 
    this is Object before closing> com.juradent.springdemo.TrackCoach@69b0fd6f
    Closing context
    Jun 09, 2022 6:36:01 PM org.springframework.context.support.AbstractApplicationContext doClose
    INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6d9c638: startup date [Thu Jun 09 18:36:00 CEST 2022]; root of context hierarchy
    After closing context
    this is a regular usage of bean reference> Run for 20 min
    this is Object AFTER closing> com.juradent.springdemo.TrackCoach@69b0fd6f
    this is AFTER CASTING> Run for 20 min
 类似资料:
  • 问题内容: 我有三个问题。 为了解释,我正在查看某人的代码,并注意到有时没有关闭。通常,Eclipse会警告您这是潜在的内存泄漏(我已修复)。但是,在Callable内部类中,没有警告。 编写代码的人都是经验丰富的Java开发人员,所以我首先想到的是它是故意的…但是可能是他们在编写代码时只是匆忙而忽略了它。 我的问题是: Eclipse为什么不突出显示这一点(可以通过以下问题的答案来回答)? 如果

  • 编辑问题,以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将帮助其他人回答这个问题。 我们知道:load with memory_order_acquire,store with memory_order_release但是,我发现用gcc4.8.2,open -O2时,抛出了一个编译错误,/usr/include/c/4 . 8 . 2/atomic:199:9:error:对于

  • 问题内容: 我想知道当你使用注释方法时实际发生了什么?当然,我知道Spring将把该方法包装在Transaction中。 但是,我有以下疑问: 听说Spring创建了代理类?有人可以更深入地解释这一点。该代理类中实际包含什么?实际班级会怎样?我怎么能看到Spring创建的代理类 我还在Spring文档中读到: 注意:由于此机制基于代理,因此仅会拦截通过代理传入的“外部”方法调用。这意味着“自调用”

  • 我正在处理xml,我需要每条记录发送一条消息,当我收到最后一条记录时,我关闭了kafka生产者,这里的问题是kafka生产者的发送方法是异步的,因此,有时当我关闭生产者时,它会拖曳我在某个地方读到过,我可以让制片人敞开心扉。我的问题是:这意味着什么,或者是否有更好的解决方案。 -编辑- 想象以下场景: 我们阅读标签并创建kafka生产者 对于每个元素,我们读取其属性,生成一个json对象并使用se

  • 我不确定“页面遍历”是否发生在特殊的硬件电路中,或者页表是否存储在L2/L3高速缓存中,或者它们是否只驻留在主存中。

  • 这个问题是关于布尔值而不是布尔值的(但我很想知道两者是否相同)。假设您有一个函数正在对数据执行多次检查,并且在每种情况下它都有特定的响应。您希望函数显示所有无效输入的大小写(以及它们无效的原因),因此您希望检查所有输入(而不仅仅是一个并停止和返回)。使用单个布尔值(如Boolean x=isValidEmail(String email))然后处理它是否无效并在未来的检查中重用x以使您不分配额外的