Bean的作用域

目录

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中的作用域不在同一个等级的。

bean的作用域
singleton单例作⽤域
prototype原型作⽤域(多例作⽤域)
request请求作⽤域
session会话作⽤域
application全局作⽤域
websocketHTTP WebSocket 作⽤域

下面给大家介绍一下常见的前五种bean的作用域。

1.singleton-默认值

该作⽤域下的Bean在IoC容器中只存在⼀个实例。

bean在整个spring中只有一份,他是全局共享的,若是其他人修改了一个bean的值,之后再读取的都是修改后的值:获取Bean(使用applicationContext.getBean等方法获取)及装配Bean(使用@Autowired@Resource)都是同一个对象。

spring中如果不显示设置,默认值为Singleton。

2.prototype

每次对该作⽤域下的Bean的请求都会创建新的实例。

容器初始化时不创建bean实例,而在每次请求时都创建一个新的bean实例,并返回:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例。

一般来说,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

上边两种是spring中的两种作用域,后边三种都是在springmvc中存在的。

前两种spring中的作用域是对于一次application(获取上下文操作)而言的,而其他的四种作用域是在springmvc中才存在的。

3.request

每次http请求会创建新的Bean实例,类似于prototype 。

⼀次http的请求和响应共享一个Bean,只要没有发起新的请求,那么在这次的http请求中,都是共享的是同一个bean.

4.session

在⼀个http session中,定义⼀个Bean实例,就是同一个会话中的bean是共享的。

5.application

在⼀个http servlet Context中,只定义⼀个Bean实例,就是一个web服务中只有一个实例。

sigleton作用域和application的区别:

是不是觉得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注解。

注解之后,在同一个上下文的情况下就会获取到不同的对象。

 下次再见哦~~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值