关于 Spring bean 容器中的作用域和垃圾回收

     2023-03-06     26

关键词:

【中文标题】关于 Spring bean 容器中的作用域和垃圾回收【英文标题】:Regarding the scope and garbage collection in Spring bean container 【发布时间】:2011-12-07 16:45:29 【问题描述】:

我是 Spring 新手,目前正在我的一个项目中使用它。我了解到 Spring 容器包含所有 bean,所有 bean 的范围默认为"singleton"。我可以在application-context.xml 文件中或使用注释@Scope 更改范围。 我还了解到,如果一个类具有"prototype" 的范围,Spring 容器将在需要时实例化该类的一个新对象。

我不明白的是:垃圾收集是如何处理的。如果不再需要创建的对象,它们是否会被垃圾回收,或者它们仍会保留在容器中。显然,我不希望创建和保留很多对象以保持低内存使用率。

【问题讨论】:

【参考方案1】:

来自 Spring 文档 (3.5.2 The prototype scope):

与其他范围相比,Spring 不管理原型 bean 的完整生命周期:容器实例化、配置和以其他方式组装原型对象,并将其交给客户端,使用没有该原型实例的进一步记录

简单地说——一旦你创建并获得了对prototype作用域bean的引用,它就是JVM中唯一存在的引用。一旦此引用超出范围,该对象将被垃圾回收:

void bar() 
  Object foo = ctx.getBean("foo")

离开bar() 方法的那一刻,没有任何其他对foo 新实例的引用,这意味着它有资格进行垃圾回收。这个模型的结果是:

因此,尽管 initialization 生命周期回调方法在所有对象上都被调用,而不管范围如何,但在原型的情况下,配置的销毁生命周期回调不会被调用。

【讨论】:

我试图理解这一点。那么它是否使 @PreDestroy 与原型 bean 无关? @Larsen 是的,就是这个意思。【参考方案2】:

容器不会保留对实例化 bean 的引用,使用它们的代码会保留。

如果没有其他内容(大致)引用该 bean,则它符合 GC 条件。

【讨论】:

非常感谢您的快速回复

springbean作用域和生命周期

参考技术Aspringbean默认为单例,避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高。像表现层、业务层、数据层、工具类对象只需要调用方法,比较适合交给SpringIoC容器管理但是像那种需要封装实例的域对象,因为会... 查看详情

springbean的作用域和生命周期

...,session,gloabsession2.通过scope=""来进行配置3.对于singleton spring容器只会创建一个共享实例,prototype则会创建不同的实例 bean的生命周期(bean自身的方法,bean级生命周期接口方法,容器级生命周期接口方法)分为BeanFact 查看详情

bean的作用域和生命周期

一、Bean的作用域(Bean的类型)Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。Spring有6个作用域,最后四种是基于SpringWebMVC生效。singleton(单例模式):该作用域下的Bean在IOC容器中只存在一个... 查看详情

在spring中,bean有几种作用域?

...1、singleton作用域当一个bean的作用域设置为singleton,那么SpringIOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时... 查看详情

spring中支持几种作用域?

参考技术A7.Spring中支持几种作用域Spring容器中的bean可以分为5个范围:prototype:为每一个bean请求提供一个实例。singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。request:为每一个网络请求创建... 查看详情

spring中bean的五种作用域?spring中的bean是线程安全的吗?

spring中bean的五种作用域当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:singleton:单例模式,在整个SpringIoC容器中,使用singleton定义的Bean将只有一个... 查看详情

spring(bean作用域和生命周期)(代码片段)

目录1.案例1:Bean作用域的问题2.作用域3.设置Bean的作用域4.Spring的执行流程5.Bean的生命周期1.案例1:Bean作用域的问题现在有一个公共的Bean,通过给A用户和B用户使用,然后在使用的过程中A偷偷的修改了公共Bean的数据,导致B在使用时发... 查看详情

spring中的bean是线程安全的吗?

结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring的bean作用域(scope)类型... 查看详情

spring中bean的作用域

   在Spring中,那些组成应用程序的主体及由SpringIoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean的定义... 查看详情

spring@bean注解可以作用在重载的方法上吗

在Spring框架中,@Bean注解通常用于将方法返回的对象注册到Spring容器中,并在需要时进行依赖注入。对于重载的方法,也可以使用@Bean注解,但需要注意以下几点:@Bean注解是用于标识一个方法返回的对象需要被注册到Spring容器中... 查看详情

spring中的scope配置和@scope注解

Scope,也称作用域,在SpringIoC容器是指其创建的Bean对象相对于其他Bean对象的请求可见范围。在SpringIoC容器中具有以下几种作用域:基本作用域(singleton、prototype),Web作用域(reqeust、session、globalsession),自定义作用域。 1... 查看详情

详解spring中bean的作用域与生命周期(代码片段)

摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我就来和大家讲一... 查看详情

spring中bean的五个作用域

当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:singleton:单例模式,在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例prototype:原型模式... 查看详情

spring中的bean(代码片段)

Spring中的BeanBean的配置Spring可以被看做是一个大型工厂,这个工厂的作用就是生产和管理Spring容器中的Bean。如果想要在项目中使用这个工厂,就需要开发者对Spring的配置文件进行配置。Spring容器支持XML和Properties两种格式... 查看详情

spring支持的几种bean的作用域

Spring容器中的bean可以分为5个范围:(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。(2)prototype:为每一个bean请求提供一个实例。(3)request 查看详情

spring框架中的单例bean是线程安全的吗?(代码片段)

结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring的bean作用... 查看详情

spring框架中的单例bean是线程安全的吗?(代码片段)

结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring的bean作用... 查看详情

springaware接口解析

参考技术ASpring的依赖注入的最大亮点是所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容器换成其他的容器,Spring容器中的Bean的耦合度因此也是极低的。但是我们在实际的开发中,我们却经常要用到Spring容器本身的... 查看详情