Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0之后,又引入了另外三种scope类型,即request,session和global session类型。不过这三种类型有所限制,只能在web应用中使用,也就是说,只有在支持web应用的ApplicationContext中使用这三个scope才是合理的。
1. singleton
singleton类型的bean定义,在一个容器中只存在一个实例,所有对该类型bean的依赖都引用这一单一实例,这就好像每个幼儿园都会有一个滑梯一样,这个幼儿园的小朋友共同使用这一个滑梯,而对于幼儿园容器来说,滑梯就是一个singleton的bean。
此外,singleton类型的bean定义,从容器启动,到他第一次被请求而实例化开始,只要容器不销毁或退出,该类型的bean的单一实例就会一直存活。
通常情况下,如果你不指定bean的scope,singleton便是容器默认的scope,所以,下面三种配置,形式实际上达成的是同样的效果:
DTD or XSD:
<bean id ="mockObject1" class="..." />
DTD:
<bean id ="mockObject1" class="..." singleton="true" />
XSD:
<bean id ="mockObject1" class="..." scope="singleton" />
2 prototype
scope为prototype的bean,容器在接受到该类型的对象的请求的时候,会每次都重新生成一个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一个新的实例之后,就由这个对象“自生自灭”了。
让我们继续幼儿园的比喻,我们今天要分苹果了!将苹果的bean的scope属性声明为prototype,在每个小朋友领取苹果的时候,我们都是发一个新的苹果给他,发完之后,小朋友爱怎么吃就怎么吃,爱什么时候吃什么时候吃,但是注意吃完要把果核扔到垃圾箱哦!对于那些不能共享使用的对象类型,应该将其定义的scope设为prototype,通常,声明为prototype的的bean,都是一些有状态的,比如保存为每个顾客信息的对象。
可以用一下方式定义prototype类型的bean:
DTD:
<bean id ="mockObject1" class="..." singleton="false" />
XSD:
<bean id ="mockObject1" class="..." scope="prototype" />
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>
<bean id="stockService" class="cn.itcast.service.impl.StockServiceImpl" scope="prototype" lazy-init="true"></bean>
在每个Spring IOC容器中一个bean定义只有一个对象实例,默认情况下会在容器启动是初始化bean,但我们可以指定bean接点的lazy-init="true" 来延迟初始化bean,这个时候,只有第一次获取bean才会初始化bean对象,
如果相对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init="true",如下:
<beans default-lazy-init="true" ....>
3 request ,session和global session
这三个类型是spring2.0之后新增的,他们不像singleton和prototype那么通用,因为他们只适用于web程序,通常是和XmlWebApplicationContext共同使用,将在第6章详细讨论,这里简单介绍。
request:
<bean id ="requestPrecessor" class="...RequestPrecessor" scope="request" />
Spring容器,即XmlWebApplicationContext 会为每个HTTP请求创建一个全新的RequestPrecessor对象,当请求结束后,,该对象的生命周期即告结束。当同时有10个HTTP请求进来的时候,容器会分别针对这10个请求创建10个全新的RequestPrecessor实例,且他们相互之间互不干扰,从不是很严格的意义上说,request可以看做prototype的一种特例,除了场景更加具体之外,语意上差不多。
session:
对于web应用来说,放到session中最普遍的就是用户的登录信息,对于这种放到session中的信息,我们我们可以使用如下形式的制定scope为session:
<bean id ="userPreferences" class="...UserPreferences" scope="session" />
Spring容器会为每个独立的session创建属于自己的全新的UserPreferences实例,他比request scope的bean会存活更长的时间,其他的方面真是没什么区别。
global session:
<bean id ="userPreferences" class="...UserPreferences" scope="globalsession" />
global session只有应用在基于porlet的web应用程序中才有意义,他映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待。
分享到:
相关推荐
当我们谈论"SSH笔记-bean的作用域"时,这里SSH指的是Spring、Struts和Hibernate这三大Java Web开发框架的缩写,但具体讨论的是Spring框架中的内容。 在Spring 4中,Bean的作用域有以下几种: 1. **单例(Singleton...
除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...
`scope`属性可以设置对象的作用域,如单例(singleton)或原型(prototype)。 Spring还支持使用`<property>`标签来进行属性注入,通过`name`属性匹配对象的属性名,并通过`ref`属性引用其他bean来注入依赖。此外,还...
以下将详细介绍Spring学习笔记中的主要知识点。 **面向抽象编程** 面向抽象编程是一种设计原则,强调在代码中使用接口或抽象类,而不是具体实现类。这使得系统更具有灵活性,易于扩展和维护。在Spring框架中,我们...
`@Scope` 注解定义 Bean 的作用域,如单例(`singleton`)、原型(`prototype`)等。`@PostConstruct` 和 `@PreDestroy` 分别标记初始化和销毁方法。 ### 4. XML 配置 在 XML 配置中,`<bean>` 标签定义 Bean,并...
- **Singleton(单例)**:这是Spring中最常见的Bean作用域,意味着在整个应用中,对于同一个Bean ID,只会有一个实例存在。当ApplicationContext被创建时,Spring会默认初始化所有的Singleton Bean。如果不想在...
【标题】"spring学习笔记(五)"主要涵盖了Spring框架中关于Bean的作用域(Bean Scope)这一核心概念。在Spring框架中,Bean Scope是控制对象生命周期和单例或多例行为的关键。接下来,我们将深入探讨这个主题。 ...
5. **Bean的Scope**:Spring提供了多种Bean的作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)等,可以根据需求选择合适的Bean作用域。 6. **注解驱动开发**:Spring 2.5引入了...
Spring学习之路(黑马课程...Spring学习之路是指通过学习Spring框架来掌握IOC反转控制的关键技术,并且学习Bean的创建和管理、Bean的作用域、Bean的实例化方式、Bean的延迟加载、Bean的初始化函数和销毁函数等知识点。
### Spring学习笔记知识点详解 #### 一、面向接口(抽象)编程的概念与好处 - **概念**:面向接口编程是一种编程范式,它强调通过接口(即定义一组方法的规范而不实现具体逻辑)来设计软件架构。这种方式的核心是将...
### Spring 2.5 学习笔记知识点梳理 #### 第一课:面向抽象编程 - **定义**:面向抽象编程是一种编程范式,强调通过抽象类或接口来设计程序结构,减少对具体实现的依赖。 - **优势**: - 提高了系统的可维护性与...
- **Prototype 作用域**:通过在 `bean` 标签中设置 `scope="prototype"`,可以使得每次获取 Bean 都会创建一个新的实例。 - **Lazy Initialization**:可以使用 `lazy-init="true"` 来延迟 Bean 的初始化,这意味...
- `<bean id="" class="" scope="singleton|prototype">`: 设置Bean的作用域,默认为单例。 - **生命周期管理**: - `<bean id="" class="" init-method="" destroy-method="">`: 指定初始化和销毁方法。 - **后...
3. **注解的应用**:Spring提供了多种注解,用于实现不同的功能,如`@PostConstruct`和`@PreDestroy`分别标记初始化和销毁方法,`@Transactional`用于声明式事务管理,`@Scope`定义bean的作用域,如单例(singleton...
Spring Boot默认大多数bean为Singleton作用域,但可以通过scope属性进行修改。 3. **自定义Starter的源码** Starter是Spring Boot的一大特色,它提供了一种快速引入特定功能模块的方式。自定义Starter通常包含以下...
本篇我们将聚焦于"Spring学习笔记系列之三"中的关键知识点——SpringMVC的源码分析,特别是父子容器的启动原理。这个主题是理解Spring MVC工作流程、定制化配置以及优化应用程序性能的关键。 首先,我们要明白...