Spring Bean 范围

Stella981
• 阅读 557

##Scope分类

scope 范围

说明

singleton

(默认)每个Spring IoC容器定义单个bean实例

prototype

任意数量的对象实例

request

每个HTTP请求都有自己的Bean实例

session

HTTP会话的生命周期将共用同一个Bean实例

globalSession

全局HTTP会话的生命周期将共用同一个Bean实例。仅在Portlet上下文中使用时有效

application

ServletContext的生命周期将共用一个Bean实例

websocket

WebSocket的生命周期将共用同一个Bean实例

其中 request, session, globalSession, application, websocket 只有使用Web的容器时候才有效.如果在ClassPathXmlApplicationContext中使用时,将会抛出IllegalStateException

##Scope详解

###Singleton(单例)

只管理bean的一个共享实例,并且Spring容器对所有对具有与该bean定义匹配的请求返回同一个bean实例。也就是说,当一个bean作为一个singleton作用域时,Spring IoC容器只创建一个该bean定义的对象​​实例。这个实例存储在缓存中,所有后续请求和引用都返回缓存的对象。如下图所示:

Spring Bean 范围

Spring的单例模式,不同于设计模式中的单例模式,Spring的单例模式是强制同一个容器只创建和使用一个实例,而设计模式中的单例模式是强制每个ClassLoader只创建一个实例。

###Prototype(原型)

每次对bean的请求时都会创建新的bean实例。bean被注入到另一个bean中,或者通过对容器的getBean()方法调用来请求它。

Spring Bean 范围

Spring容器对原型作用域bean的创建,其实就是替代Java new操作符。

不管范围如何,所有对象会调用初始化生命周期方法(init-method),但在原型的情况下,Bean不会回调销毁生命周期方法(destroy-method)

通常,对所有有状态bean使用原型作用域,对无状态bean使用单例作用域。

##测试代码

测试代码

Bean定义

测试结果如下图:

Spring Bean 范围

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
spring中@Scope控制作用域
  注解形势:通过@Scope注解控制作用域,默认使用单实例模式,可修改为多实例模式1/2Specifiesthenameofthescopetousefortheannotatedcomponent/bean.3<pDefaultstoanempty
Easter79 Easter79
2年前
Spring中管理Bean依赖注入之后和Bean销毁之前的行为
    对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束、何时销毁。Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为。Bean依赖关系注入之后的行为:    Spring提供了两种方式在Bean全部属性设置成功后执行特定的行为:在Spring配置文件
Easter79 Easter79
2年前
Spring框架笔记(七)——Spring IOC容器Bean的作用域
每个Bean都有自己的作用域,它们会在特定的时间生成,在特定的范围生存。SpringIOC容器的bean有四种作用域:!(http://static.oschina.net/uploads/space/2015/0718/222714_BcCF_1156339.png)其中默认的作用域是singleton,单例模式。也就是我们之前配置的bean
Stella981 Stella981
2年前
Spring 源码分析之 bean 实例化原理
本次主要想写springbean的实例化相关的内容。创建springbean实例是springbean生命周期的第一阶段。bean的生命周期主要有如下几个步骤:<fontcolor'red'创建bean的实例</font给实例化出来的bean填充属性初始化bea通过IOC容器使用bean
Stella981 Stella981
2年前
Bean 实例化和获取
实例化BeanSpring实例化bean的时机有两个:1.IOC容器启动时候;2.真正调用的时候;如果bean声明为scopesingleton且lazyinitfalse,则容器启动时候就实例化该bean(Spring默认就是此行为)。否则在调用时候再进行实例化。IOC容器
Wesley13 Wesley13
2年前
JAVA记录
singleton作用域:当把一个Bean定义设置为singleton作用域是,SpringIoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton作用域是Spring中的缺省作用域。prototype作用域:protot
Easter79 Easter79
2年前
Spring容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:singleton:单例模式,在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例prototype:原型模式,每次通过容器
Easter79 Easter79
2年前
Spring实例化Bean的三种方法
实例化Bean有三种方式,分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。本节将针对这三种方式分别进行讲解。构造器实例化构造器实例化是指Spring容器通过Bean对应的类中默认的构造函数实例化Bean。下面通过案例演示如何使用构造器实例化Bean。1\.创建项目并导入JAR包在MyEclipse中
Easter79 Easter79
2年前
Spring中的bean是线程安全的吗?
结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring的bean作用域(scope)类型:singleton:单例,默认作用域。p