(六)Spring中bean的作用域

一、singleton作用域

是指在Spring IoC容器中仅存在一个Bean的示例,Bean以单实例的方式存在,单实例模式是重要的设计模式之一,在Spring中对此实现了超越,可以对那些非线程安全的对象采用单实例模式。

接下来看一个示例:

<bean id="car" class="cn.lovepi.Car" scope="singleton"></bean>
<bean id="boss1" class="cn.lovepi .Boss” p:car-ref=“car"></bean>
<bean id="boss2" class="cn.lovepi .Boss” p:car-ref=“car"></bean>
<bean id="boss3" class="cn.lovepi .Boss” p:car-ref=“car"></bean>

在1中car这个Bean生命周期声明为了singleton模式,其他的bean如2,3,4引用了这个Bean。在容器中boss1、boss2、boss3的属性都指向同一个bean car。如下图所示:

不仅在容器中通过对象引入配置注入引用相同的car bean,通过容器的getBean()方法返回的实例也指向同一个bean。
在默认的情况下Spring的ApplicationContext容器在启动的时候,自动实例化所有的singleton的bean并缓存于容器当中。

虽然启动时会花费一定的时间,但是他却带来了两个好处:
对bean提前的实例化操作,会及早发现一些潜在的配置的问题。
Bean以缓存的方式运行,当运行到需要使用该bean的时候,就不需要再去实例化了。加快了运行效率。

二、prototype作用域

是指每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new Bean()的操作。在默认情况下,Spring容器在启动时不实例化prototype的Bean。

接下来看一个示例

1. <bean id=“car" class="cn.lovepi.Car" scope=“prototype"></bean>
2. <bean id=“boss1" class="cn.lovepi.Boss” p:car-ref=“car"></bean>
3. <bean id=“boss2" class="cn.lovepi.Boss” p:car-ref=“car"></bean>
4. <bean id=“boss3" class="cn.lovepi.Boss” p:car-ref=“car"></bean>

三、request,sessionglobalSession

当用户使用Spring的WebApplicationContext时,还可以使用另外3种Bean的作用域,即request,sessionglobalSession

  1. request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。
    • <bean id="loginAction" class="com.cnblogs.Login" scope="request"/>,针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。
  2. session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。
    • <bean id="userPreference" class="com.ioc.UserPreference" scope="session"/>,同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。
  3. global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

参看:

https://www.cnblogs.com/zhanglei93/p/6231882.html

https://blog.csdn.net/weidaoyouwen/article/details/80503575

猜你喜欢

转载自blog.csdn.net/jiangshangchunjiezi/article/details/88827550