Spring Bean作用域详解:从singleton到prototype

需积分: 14 2 下载量 96 浏览量 更新于2024-09-15 收藏 37KB DOC 举报
"本文详细介绍了Spring框架中bean的作用域,包括默认的singleton和prototype两种,以及Spring 2.0新增的session、request、global session三种Web应用程序上下文的作用域。此外,还提到了Spring 2.0对Bean类型的灵活扩展支持,允许用户自定义新的Bean类型。" 在Spring框架中,bean的作用域是指bean在ApplicationContext或WebApplicationContext中的生命周期和可见性。作用域的选择直接影响了bean的实例化次数和其生命周期管理。 1. singleton作用域 当bean的`scope`属性设置为`singleton`(或不设置,因为`singleton`是默认作用域)时,Spring容器会在初始化时创建一个唯一的bean实例,并将该实例存储在缓存中。每当其他bean需要依赖此`singleton` bean时,都会返回同一个实例。这与传统的设计模式中的单例不同,Spring的`singleton`作用域只保证在容器内部的单例,而不是全局的类加载器级别的单例。配置示例: ```xml <bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/> 或者 <bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/> ``` 2. prototype作用域 `prototype`作用域的bean表示每次请求都会创建一个新的实例。这意味着,如果一个bean被声明为`prototype`,并且在其他bean中注入或通过ApplicationContext获取时,每次都会返回一个新的实例。这适用于需要多个实例或者具有独立状态的对象。配置示例: ```xml <bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/> ``` 3. Web上下文作用域 - session:在Web环境中,`session`作用域的bean与HTTP会话关联。每个会话都拥有自己的一份bean实例,对于同一会话内的多次请求,将返回同一bean实例。 - request:`request`作用域的bean在每次HTTP请求中都创建一个新的实例。在一次请求中,所有对bean的引用都将返回同一个实例,但对不同请求来说,它们是独立的。 - global session:在基于portlet的应用中,`global session`作用域的bean与portlet的全局会话关联。在portlet应用中,全局会话跨越多个portlet实例,提供了一种共享数据的方式。 4. 自定义作用域 Spring 2.0引入了可扩展的bean作用域,允许开发者定义自己的作用域。这需要实现`Scope`接口并注册到Spring容器中。这样,用户就可以根据特定的应用需求创建新的bean生命周期和范围。 正确理解并选择bean的作用域对于优化Spring应用的性能和设计至关重要。选择合适的作用域可以帮助减少不必要的内存消耗,同时确保正确的对象实例化和状态管理。