适合新手的spring讲解(1)---spring bean的作用域

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象。
Spring中的bean默认都是单例的,对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spring框架之后,每个Action都是单例的,那么对于Spring托管的单例Service Bean,Spring的单例是基于BeanFactory也就是Spring容器的,单例Bean在此容器内只有一个,Java的单例是基于JVM,每个JVM内只有一个实例。

bean的作用域

创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例,这个bean就像医生的开的处方,而创建的真正的实例,就像各科室拿着这个"处方"(bean)实例化一份,来做自己的事情一样。我个人很喜欢这个比喻,它与class很类似,只根据一张“处方”就可以创建多个实例,比如就下面的singleton而言(单例),单例模式下spring容器只创建一个bean,就像医生只开一个处方,不管哪个科室需要医生的处方(获取实例),处方都只有一份,它们指向的都是这一个“处方对象”(多个实例指向同一个bean)。
spring提供了多种针对bean的属性,不仅可以控制注入到对象中的各种依赖和配置值,还可以控制该对象的作用域。这样可以灵活选择所建对象的作用域,而不必在Java Class级定义作用域。Spring Framework支持五种作用域,分别阐述如下表。
在这里插入图片描述
五种作用域中,request、session和global session三种作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

(1)当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:
在这里插入图片描述
(2)当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。也就是说,当作用域为Prototype时,医生的“处方”不再只存在一份,而是多份,可以粗浅的理解为各个科室把该处方都复制了一份,每到一个科室,都会产生一个新的“处方”(bean),此时的“处方”(bean)对象有多个,不再只是单例模式下的一份。理论原理:Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:
在这里插入图片描述
在学习时,看到书上有这么一句话:当bean的作用域为单例时,spring容器就只会存在一个共享的bean,并且所有对bean的请求,只要id与该bean的id属性相匹配,就会返回同一个bean实例。当时对这个“只要id与该bean的id属性相匹配,就会返回同一个bean实例”这句话理解有所偏差,自己以为是xml中的不同bean的id相同,而class指向了不同的实现类,这样返回的也是一个bean实例,如下图:
在这里插入图片描述
经过验证,才发现自己的想法,也就是上图这种方式是错误的,spring是不允许bean的id相同的,会报bean已存在的异常,如下图所示:
在这里插入图片描述
正确的理解应该是,那句话中的id指的是我们通过getBean()方法在获取bean时候传入的id与xml中bean的id属性相同,即返回同一个bean实例。

-------若有不对之处,敬请各位大佬指正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值