目录
1.singleton-默认值
2.prototype
上边两种是spring中的两种作用域,后边三种都是在springmvc中存在的。
3.request
4.session
5.application
sigleton作用域和application的区别:
设置作用域
Spring中的核心就是存取bean,那么本篇文章我们来研究一下bean的作用域。
bean的作用域是指bean在整个spring框架下的某种行为模式。就是bean的行为的范围。
简单的理解:创建的bean的个数。
spring容器在创建bean的时候会指定bean的作用域。那么bean的作用域一共有六种,常见的是前五种。在普通的spring项目中只有前两种作用域,后边四种是基于springmvc中生效的。
spring和springmvc都是容器,容器就是管理对象的地方。
但是spring是父容器,springmvc是子容器。子容器是可以访问父容器的对象的,但是父容器不可以访问子容器的对象,也就是说springmvc可以访问spring中的对象,而spring中的对象是不可以访问springmvc中的对象的。那么在本篇文章中,spring的bean的作用域和springmvc中的作用域不在同一个等级的。
singleton | 单例作⽤域 |
prototype | 原型作⽤域(多例作⽤域) |
request | 请求作⽤域 |
session | 会话作⽤域 |
application | 全局作⽤域 |
websocket | HTTP WebSocket 作⽤域 |
下面给大家介绍一下常见的前五种bean的作用域。
该作⽤域下的Bean在IoC容器中只存在⼀个实例。
bean在整个spring中只有一份,他是全局共享的,若是其他人修改了一个bean的值,之后再读取的都是修改后的值:获取Bean
(使用applicationContext.getBean
等方法获取)及装配Bean
(使用@Autowired
或@Resource
)都是同一个对象。
spring中如果不显示设置,默认值为Singleton。
每次对该作⽤域下的Bean的请求都会创建新的实例。
容器初始化时不创建bean实例,而在每次请求时都创建一个新的bean实例,并返回:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例。
一般来说,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
前两种spring中的作用域是对于一次application(获取上下文操作)而言的,而其他的四种作用域是在springmvc中才存在的。
每次http请求会创建新的Bean实例,类似于prototype 。
⼀次http的请求和响应共享一个Bean,只要没有发起新的请求,那么在这次的http请求中,都是共享的是同一个bean.
在⼀个http session中,定义⼀个Bean实例,就是同一个会话中的bean是共享的。
在⼀个http servlet Context中,只定义⼀个Bean实例,就是一个web服务中只有一个实例。
是不是觉得1和5的作用域怎么感觉很像呢?那么这里具体说明一下sigleton作用域和application的区别:
singleton 是 Spring Core 的作⽤域;application 是 Spring Web(即是Spring MVC) 中的作⽤域;
singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。
一个web服务,有一个servlet Context,但是可以有多个application Context.
我们在spring中,取bean的时候,最开始会有一次获取上下文,这个时候就是一个ApplicationContext,那么在只获取了一次上下文的情况下就是singleton的作用域:后边用这个上下文取到得bean都是同一个。但是当我们再次取一个新的上下文得时候,那么用这个上下文获取的bean和之前那个上下文获取的bean就不是同一个了。
那么在spring中默认的作用域是sigleton的,但是也说了一般有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。所以我们是可以设置作用域的:通过@Scope注解。
注解之后,在同一个上下文的情况下就会获取到不同的对象。
下次再见哦~~