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 全局作⽤域
websocket HTTP 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作用域。

Bean的作用域_第1张图片

上边两种是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注解。

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

Bean的作用域_第2张图片

 下次再见哦~~

你可能感兴趣的:(javaEE,java,数据库,sql)