spring Bean的五种scope
scope用来声明IOC容器中的对象应当处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。打个比喻吧!我们都是处在社会(容器)中,假如把中学老师作为一个类定义,那么当容器初始化这些类之后,中学老师只能局限在中学这个场景中,中学,就可以看做中学老师的scope。 Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0之后,又引入了另外三种scope类型,即request,session和global session类型。不过这三种类型有所限制,只能在web应用中用法,也就是说,惟独在支持web应用的AppliionContt中用法这三个scope才是合理的。 可以用法bean的singleton或scope属性来指定相应对象的scope,其中,scope属性只能在XSD格式的文档生命中用法,类似于如下代码所演示的形式: DTD: bean ="mockObject1" singleton="fae" / XSD: bean id ="mockObject1" 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" / DTD: bean id ="mockObject1" singleton="ue" / XSD: bean id ="mockObject1" scope="singleton" / 2 prototype scope为prototype的bean,容器在接受到该类型的对象的哀求的时候,会每次都重新生成一个新的对象给哀求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要预备完毕,并且对象实例返回给哀求方之后,容器就不在拥有当前对象的引用,哀求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回哀求方该对象的一个新的实例之后,就由这个对象“自生自灭”了。 让我们继续幼儿园的比方,我们今日要分苹果了!将苹果的bean的scope属性声明为prototype,在每个小伴侣领取苹果的时候,我们都是发一个新的苹果给他,发完之后,小伴侣爱怎么吃就怎么吃,爱什么时候吃什么时候吃,但是注重吃完要把果核扔到垃圾箱哦!对于那些不能分享用法的对象类型,应当将其定义的sc
ope设为prototype,通常,声明为prototype的的bean,都是一些有状态的,比如保存为每个顾客信息的对象。 可以用一下方式定义prototype类型的bean: DTD: bean id ="mockObject1" singleton="false" / XSD: bean id ="mockObject1" scope="prototype" / 3 request ,session和global session 这三个类型是spring2.0之后新增的,他们不像singleton和prototype那么通用,由于他们只适用于web程序,通常是和XmlWebApplicationContext共同用法,将在第6章具体研究,这里容易介绍。 request: bean id ="requestPrecessor" scope="request" / Spring容器,即XmlWebApplicationContext 会为每个HTTP哀求创建一个全新的RequestPrecessor对象,当哀求结束后,,该对象的生命周期即告结束。当同时有10个HTTP哀求进来的时候,容器会分离针对这10个哀求创建10个全新的RequestPrecessor实例,且他们互相之间互不干扰,从不是很严格的意义上说,request可以看做prototype的一种特例,除了场景越发详细之外,语意上差不多。 session: 对于web应用来说,放到session中最普遍的就是用户的登录信息,对于这种放到session中的信息,我们我们可以用法如下形式的制定scope为session: bean id ="userPreferees" scope="session" / Spring容器会为每个自立的session创建属于自己的全新的UserPreferences实例,他比request scope的bean会存活更长的时光,其他的方面真是没什么区分。 global session: bean id ="user
spring framework表达式assignPreferences" scope="globalsession" / global session惟独应用在基于porlet的web应用程序中才故意义,他映射到porlet的global范围的session,假如一般的servlet的web 应用中用法了这个scope,容器会把它作为一般的session的scope对待 可分为状态Bean和无状态Bean pring还支持一种自定义scope类型
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论