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
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对待。
分享到:
相关推荐
本文将深入解析Spring中的注解式编程,主要包括IOC(Inversion of Control,控制反转)的自动装配和依赖注入的解析。 首先,我们来看一下IOC自动装配。IOC是Spring的核心特性,它将对象的创建和管理从应用代码中...
"Spring注解@Scope原理及用法解析" Spring 注解 @Scope 是 Spring IoC 容器中的一个作用域,用于定义 Bean 的生命周期和作用域。在 Spring 中,@Scope 注解可以用来定义 Bean 的实例化方式和生命周期。下面我们将...
3. **Bean的生命周期管理**:书中详细解释了Spring如何创建、初始化、配置、销毁Bean,以及如何自定义这些过程,包括Bean的scope、初始化方法、销毁方法等。 4. **数据访问集成**:Spring支持多种数据库访问方式,...
在Spring框架中,`scope`是一个非常重要的概念,它决定了Spring管理的Bean的生命周期和实例化策略。默认情况下,Spring中的Bean默认为`singleton`作用域,意味着在整个应用程序中只有一个实例。然而,根据应用场景的...
本篇将深入解析Spring框架的代码,特别是从BeanFactory开始,揭示Spring如何加载和管理Bean的过程。 **一、BeanFactory:Spring的核心容器** BeanFactory是Spring中最基础的容器,负责管理和实例化对象,即Bean。...
19、spring支持集中beanscope? Spring支持以下Bean作用域: - singleton:默认作用域,在Spring IoC容器中只有一个实例。 - prototype:每次请求都会创建一个新的Bean实例。 - request:每次HTTP请求都会创建一个新...
Spring MVC和Web Flow是两种..."深入解析Spring MVC与Web Flow.pdf"这本书可能会详细阐述这些概念,包括如何配置、如何编写控制器、如何定义和管理流程,以及如何将两者整合,是学习和掌握这两种技术的重要参考资料。
《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心技术和设计理念的专业书籍。Spring作为Java企业级应用开发的主流框架,它的强大功能和灵活性深受开发者喜爱。这本书旨在帮助读者从...
下面,我们将深入探讨Spring-IOC的实现,包括注解的使用和注解解析。 1. **控制反转(IOC)概念** - 控制反转是设计模式中的一个概念,它改变了传统的对象获取方式。在没有IOC的情况下,对象通常自行创建依赖。而...
1. 配置解析:Spring首先读取配置文件(XML、Java配置类或注解),解析出Bean的定义信息,包括Bean的类型、初始化方法、依赖关系等。 2. Bean的实例化:当需要使用某个Bean时,IOC容器会根据Bean的定义创建实例。...
本文将深入探讨Spring注解的基本原理,包括它们如何被解析、处理以及如何影响应用程序的生命周期。 首先,我们需要了解注解在Java语言中的本质。注解是一种元数据,允许程序员在源代码中嵌入信息,这些信息可以被...
此外,Spring MVC还提供了模型视图解析器,如InternalResourceViewResolver,用于处理视图解析,便于实现RESTful API。 在AOP(面向切面编程)方面,Spring 4.3.7提供了强大的切面支持,允许开发者定义切面、通知...
3. **注解的应用**:Spring提供了多种注解,用于实现不同的功能,如`@PostConstruct`和`@PreDestroy`分别标记初始化和销毁方法,`@Transactional`用于声明式事务管理,`@Scope`定义bean的作用域,如单例(singleton...
`ApplicationContext`是Spring的核心接口,它继承了`BeanFactory`接口,扩展了更多的企业级功能,如消息解析、事件发布、AOP代理等。通过`ApplicationContext`,我们可以获取到所有已定义的bean,并进行初始化、装配...
这个错误表明Spring在解析配置文件时遇到了问题,通常是因为配置文件中的语法错误或结构问题。在这个具体的例子中,问题出在`<bean>`元素的`scope`属性没有被正确引用。在XML配置中,所有的属性值都必须用引号括起来...
例子可能包含对bean的scope(单例、原型)、初始化方法、销毁方法的配置和使用。 3. **AOP**:Spring的AOP模块用于实现横切关注点,如日志、事务管理等。例子中可能会演示如何定义切面、通知类型(前置、后置、异常...
在这个例子中,你可能需要解析 `catalog.xml` 来了解如何配置服务、设置属性值以及声明依赖。配置文件的结构和语法与标准的 Spring XML 配置文件相似,但针对 ActionScript 的环境进行了调整。 **Maven** 是一个...
在Spring容器启动时,配置文件或注解中的bean定义会被解析成BeanDefinition对象,然后由容器进行管理。本文将深入探讨BeanDefinition的内部结构和主要属性。 首先,BeanDefinition接口继承了AttributeAccessor和...
在Spring的学习中,可能会涉及到使用Jdom解析XML配置文件或创建XML文档。 **模拟Spring功能** 在学习Spring之前,可能需要理解如何手动管理对象的依赖关系。Spring通过IOC(控制反转)和DI(依赖注入)实现了对...
9. **AOP增强**:Spring的AOP框架在4.0.3中引入了更多的切面编程特性,例如支持JSR-330标准的`@Scope`注解,以及对环绕通知的改进。 10. **安全框架**:Spring Security 4.0.3版本提供了更强大的认证和授权机制,...