SpringBean的作用域

262 阅读2分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

大家好,我是掘金新用户小钻风头领,今天是我正式更文的第三天; 今天说一下SpringBean的作用域问题

Bea的作用域

类别说明
singleton在spring ioc容器中仅存在一个Bean实例,Bean以单例方式存在,singleton也是默认的
prototype每次从容器中调用Bean时,都会返回一个新的实例,即每次调用getBean()时,相当于执行new XxBean()
request每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
globalSession一般用于Profile应用环境,该作用域仅适用于WebApplicationContext环境

1.singleton-单例bean

当一个bean的作用域为singleton,那么spring IOC容器中只会存在一个共享的bean实例,并且对bean的所有请求只要id与该bean相匹配,则只会返回bean的同一实例。
单例模式就是在创建容器的时候就同时创建了bean的对象,不管你是否使用,但我们可以指定 lazy-init="true" 懒加载; 这样的话只有在第一次获取bean的时候才会初始化bean,即第一个请求该bean的时候才初始化。
每次获取到的对象都是同一个对象。

<bean id="ServiceImpl" class="org.xx.ServiceImpl" scope="singleton"

我们也可以通过@Scope注解来指定bean的作用范围

@Service
@Scope("singleton")
public class ServiceImpl{
}

2.prototype-多例

当一个bean的作用域为prototype,那么这个bean对应多个对象实例,prototype作用域的bean会导致每次对该bean请求(将其注入到另一个bean中 或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。prototype是原型类型,它在我们创建容器的时候并没有初始化,而是当我们获取bean的时候才会创建对象,而且我们每次获取到的对象都不是同一个对象
建议对有状态的bean使用prototype作用域,没有状态的则使用singleton作用域

<bean id="account" class="org.xx.DefaultAccount" scopr="prototype"/>

我们也可以通过@Scope注解来指定bean的作用范围

@Service
@Scope("prototype")
public class DefaultAccount{
}

3.request

对于request只适用于Web程序,每一次请求都会产生一个新的bean,该bean仅在当前HTTP request内有效,当请求结束后,bean的生命周期即结束

<bean id="account" class="org.xx.DefaultAccount" scopr="request"/>

4.session

session作用域同样是每次HTTP 请求都会产生一个新的bean,该bean仅在当前HTTP Session内有效。 当HTTP session废弃的时候,此bean也会废弃掉。

  <bean id="user" class="org.xx.Preferences "scope="session"/>

5.global Session

global Session作用域类似标准的HTTP request作用域,不过仅仅在基于portlet的web应用中才有意义,portlet规范定义了全局的Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。 在global session 作用域中定义的 bean 被限定于全局portlet Session的生命周期范围内。

  <bean id="user" class="org.xx.Preferences "scope="globalSession"/>