java 中bean 注解 @bean注解是单例还是多例_java 中bean 注解

@Scope是什么?

@Scope定义我们采用什么模式去创建Bean,比如说默认是单例模式,也会有多实例的方式。它定义了我们采用什么样的方式去创建和调用bean。

 

@Scope的五种取值

1.singleton

单例模式,也就是容器中只存在一个实例,不管怎么获取Bean都是只存在一个实例,singleton类型的bean定义从容器启动到第一次被请求而实例化开始,只要容器不销毁或退出,该类型的bean的单一实例就会一直存活,典型单例模式。

实际测试:

定义Scope为单例模式(也就是默认模式)

java 中bean 注解 @bean注解是单例还是多例_单例模式_02

测试的主方法编写:

java 中bean 注解 @bean注解是单例还是多例_java 中bean 注解_03

两个对象是一致的

java 中bean 注解 @bean注解是单例还是多例_生命周期_04

 

2.prototype

若使用prototype模式,spring容器每次都会重新生成一个新的Bean实例给请求方。选择该类型的对象的实例化和属性设置都由容器负责,但准备工作完成后,对象实例给到请求方后,容器不再拥有对该对象的引用,拿到该对象实例的这一方需要对该对象实例后续的生命周期负责(比如说销毁)。也就相当于设定了prototype模式后,口香糖(类比Bean对象)由工厂(类比容器)生产,生产完后,口香糖后面被拿来干嘛了有没有扔掉都不归工厂管,用户需要对口香糖后面的生命周期负责,也要负责把它丢进垃圾桶(销毁)。

实际测试:

java 中bean 注解 @bean注解是单例还是多例_单例模式_05

测试主方法同上个例子

结果:

java 中bean 注解 @bean注解是单例还是多例_生命周期_06

多实例的方式每次的对象不一样

 

3.request

同一次请求创建一个实例,bean在当前请求内有效,该可以理解成一种特殊的多例模式。当请求结束后,该对象的生命周期即告结束,他们之间相互不干扰。

 

4.session

关于session是什么我的这篇中有简单的介绍

scope为session代表同一个session创建一个实例,一个session id对应一个session。

对于web引用,能够放到session中的信息,可以将@Scope设置为session,Spring容器会为每个独立的session创建一个bean实例,相较于request模式存活时间更长。

 

5.global session

该模式在基于porlet的web程序中才有用,它映射到porlet的global session,普通的servlet中使用了这个模式,容器会将其作为普通的session的scope对待。

(“Portlets是一种Web组件-就像servlets-是专为将合成页面里的内容聚集在一起而设计的。通常请求一个portal页面会引发多个portlets被调用。每个portlet都会生成标记段,并与别的portlets生成的标记段组合在一起嵌入到portal页面的标记内。”(摘自Portlet规范,JSR 168)

portlet定义摘自

 

 

@Scope的配置方式

1.xml

<bean id="xxx" class="xxx" scope="prototype" />

2.注解

java 中bean 注解 @bean注解是单例还是多例_java 中bean 注解_07