摘自《Spring 解密》
scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。打个比方吧!我们都是处在社会(容器)中,如果把中学教师作为一个类定义,那么当容器初始化这些类之后,中学教师只能局限在中学这个场景中,中学,就可以看做中学教师的scope。
Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0之后,又引入了另外三种scope类型,即request,session和global session类型。不过这三种类型有所限制,只能在web应用中使用,也就是说,只有在支持web应用的ApplicationContext中使用这三个scope才是合理的。
可以使用bean的singleton或scope属性来指定相应对象的scope,其中,scope属性只能在XSD格式的文档生命中使用,类似于如下代码所演示的形式:
DTD:
<bean id ="mockObject1" class="..." singleton="false" />
XSD:
<bean id ="mockObject1" class="..." scope="prototype" />
注意:这里的singleton和设计模式里面的单例模式不一样,标记为singleton的bean是由容器来保证这种类型的bean在同一个容器内只存在一个共享实例,而单例模式则是保证在同一个Classloader中只存在一个这种类型的实例。
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" />
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对待。
(我只是听说过porlet这个词,好像是和servlet类似的一种java web技术,大家以后遇到的时候可以搜一下!)
spring还支持一种自定义scope类型
相关推荐
在Spring框架中,`scope`是一个非常重要的概念,它决定了Bean的生命周期和实例化策略。在Spring中,Bean的scope主要有以下几种: 1. **singleton(单例)**:这是默认的scope,每个容器中只有一个实例。无论多少次...
6. `@Scope`:定义bean的作用域,例如单例(`@Scope("singleton")`)或多例(`@Scope("prototype")`)。 **Spring容器** Spring容器是IoC的实现,它负责创建、配置和管理bean。主要有两种类型的容器:BeanFactory和...
4. `@Autowired`:这个注解用于自动装配bean的依赖,Spring会根据类型或属性名自动找到合适的依赖注入。 5. `@Qualifier`:当有多个相同类型的bean时,使用@Qualifier指定特定的bean。 6. `@Configuration`:标记...
8. **Spring_0800_IOC_AutoWire**:自动装配是Spring的特性之一,它可以根据类型或名称自动为bean的属性注入依赖,减少了手动配置的工作量。 9. **Spring_1300_IOC_Pre_Post_Scope**:这里可能讨论的是Spring的生命...
<bean id="person" class="org.viking.spring.imp.Person" scope="prototype"> <value>30 <bean class="org.viking.spring.imp.Son"> <value>11 <bean id="son2" class="org.viking.spring....
4. **Spring_0600_IOC_Bean_Scope**: Spring提供了多种bean的作用域,包括单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)等。理解每种作用域的特点及其应用场景对于优化应用性能和设计...
scope属性 名称: scope类型:属性 归属: bean标签 作用:定义bean的作用范围 格式: <bean scope=“singleton"> 取值: singleton:设定创建出的对象保存在spring容器中,是一个单例的对象(bean默认是单例) 单例...
- **`scope`属性**:用于指定Bean的生命周期范围,如`singleton`(单例模式)、`prototype`(原型模式)等。 - **`init-method`与`destroy-method`属性**:分别用于指定Bean的初始化方法和销毁方法。 #### 四、...
Spring容器会根据类型或名称自动将合适的bean注入到当前bean的属性或方法中。 3. `@Qualifier`:当有多个相同类型的bean时,`@Qualifier`可以用来指定具体要注入哪个bean。 4. `@Configuration`和`@Bean`:这两个...
在Spring框架中,`id`、`name`和`scope`是配置bean时常见的三个属性,它们对于理解和管理Bean的生命周期至关重要。今天我们将深入探讨这三个属性的含义、使用方法以及它们之间的顺序规则。 首先,`id`是Spring Bean...
<scope>runtime</scope> ``` 这里我们选择了PostgreSQL数据库驱动作为运行时依赖。 2. **创建实体类(Entity)**: Spring Data JPA通过实体类来映射数据库表。比如,我们可以创建一个`User`实体类,使用`@...
当Spring容器发现一个带有@Autowired的属性或方法时,它会尝试找到类型匹配的Bean进行注入。如果存在多个候选Bean,可以通过@Qualifier注解指定特定的Bean。 4. **@Qualifier**: 与@Autowired一起使用,用于在有多...
Spring框架在2.5版本引入了对注解的广泛支持,这一特性在后续的3.0版本中得到了进一步增强,并且成为了Spring应用的核心部分。注解的使用极大地简化了Spring配置,提高了代码的可读性和可维护性。下面将详细介绍其中...
- **Spring配置文件**:XML文件中定义了bean的声明、属性等信息。 - **bean**:表示应用程序中的对象,在Spring容器中进行管理。 #### 5. 启用Log4j日志框架 - **配置文件**:在Spring配置文件中配置Log4j。 - **...
2. 使用Spring的`@Scope("prototype")`,为每个请求创建新的Mapper实例,避免线程安全问题。 3. 利用Spring的`@Profile`注解,根据环境选择不同的配置。 通过以上步骤,我们可以实现Spring 4.x与MyBatis 4的深度...
Spring会根据类型或者属性名找到合适的依赖进行注入。 4. `@Qualifier`:当有多个相同类型的Bean,而我们需要指定具体哪一个时,可以使用`@Qualifier`注解来明确选择。 5. `@Scope`:这个注解用于定义Bean的作用...
- **SpEL(Spring Expression Language)**:Spring表达式语言,用于在运行时查询和操作Bean属性及集合。 压缩包中的“spring_injection1”文件可能包含了这些概念的代码示例,帮助读者更直观地理解和实践Spring的...
5. **Inner Beans与 prototype scope** - 如果一个Inner Bean声明为`prototype`作用域,那么每次parent bean需要这个Inner Bean时,Spring都会创建一个新的实例,这提供了在单例bean中使用多例bean的能力。 6. **...
- 需要注意的是,`destroy-method`仅对单例`scope="singleton"`的Bean有效,并且只有在手动关闭`ApplicationContext`对象时才会被调用。 - **完整的生命周期**: - Spring Bean的生命周期包括了从创建到销毁的一...