本文仅作为个人的学习记录,主要借鉴资料也已标注。
参考资料:
https://blog.csdn.net/fuzhongmin05/article/details/73389779
五个作用域
类别 | 说明 | 优点 | 缺点 |
---|---|---|---|
singleton | 单例,即SpringIOC容器只有一个实例,spring的默认作用域 | 占用空间小 | 永远存活,如果有静态属性的多线程操作就会出现线程冲突的问题 |
prototype | 原型,即SpringIOC容器每次根据应用上下文每次调用时去创建一个新的实例 | 每个Bean独立,不存在多线程的问题 | 这种方式创建的Bean生命周期不在Spring的管理范围,内存占用较大 |
request | 请求,每次http请求的时候都会创建一个新的Bean | 特定情况 | 仅在基于web的Spring ApplicationContext情形下有效 |
session | 会话,同一个http session请求的时候都会共享同一个的Bean | 特定情况 | 仅在基于web的Spring ApplicationContext情形下有效 |
globalSession | 全局会话,在一个全局的HTTP Session中,一个bean定义对应一个实例 | 特定情况 | 仅在基于web的Spring ApplicationContext情形下有效 |
1.singleton 单例
Spring的默认作用域,也是最常见的作用域,一般不写@Scope注解的话,也是默认单例。使用这种模式,bean会在
每次getBean()调用的时候,返回同一个的代理对象,且bean对象的生命周期由Spring管理,且应用中值只存在一
个Bean实例。所以在存在公共状态属性时,多线程情况下会出现线程不安全的情况。
java:
@Service
@Scope("singleton")
public class Demo {
// ...
}
xml:
<bean id="account" class="com.daer.Demo" singleton="true"/>
2.prototype 原型模式
Spring另外一种比较常见的作用域,需要使用@Scope(“prototype ”)注释。使用这种模式,bean会在每次
getBean()调用的时候,返回一个全新的代理对象,并且Spring不管理其生命周期,
java:
@Service
@Scope("prototype")
public class Demo {
// ...
}
xml:
<bean id="account" class="com.daer.Demo" singleton="false"/>
或
<bean id="account" class="com.daer.Demo" scope="prototype"/>
3.request 请求模式
针对Web应用的专用作用域,对应request请求,单个request请求通过getBean()获取的bean是一样的,不同的
request请求获取的bean是相互独立的,且不由Spring管理生命周期。(目前没使用过)
java:
@Service
@Scope("request")
public class Demo {
// ...
}
xml:
<bean id="account" class="com.daer.Demo" scope="request"/>
4.session请求模式
针对Web应用的专用作用域,对应session请求,单个session请求通过getBean()获取的bean是一样的,不同的
session请求获取的bean是相互独立的,且不由Spring管理生命周期。(目前没使用过)
java:
@Service
@Scope("session")
public class Demo {
// ...
}
xml:
<bean id="account" class="com.daer.Demo" scope="session"/>
5.golabSession请求模式
针对Web应用的专用作用域,只有 Portlet 容器才有,对应globalSession请求,表示在一个全局的http Session通过getBean()获取的bean是一样的,且不由Spring管理生命周期。()
java:
@Service
@Scope("golabSession")
public class Demo {
// ...
}
xml:
<bean id="account" class="com.daer.Demo" scope="golabSession"/>