Spring中的Bean的作用域

Spring Bean的7种作用域详解
本文介绍了Spring 4.3中Bean的7种作用域,重点关注了singleton和prototype两种作用域。singleton作用域确保每个容器只有一个Bean实例,而prototype作用域则会在每次请求时创建新的Bean实例。

Spring 4.3中为Bean的实例定义了7种作用域。

Bean的作用域
作用域名称说明

singleton

(单例)

使用singleton定义的Bean在Spring容器中将只有一个实例,也就是说,无论有多少个Bean引用它,始终将指向同一个对象。这也是Spring容器默认的作用域。

prototype

(原型)

每次通过Spring容器获取的prototype定义的Bean时,容器都将创建一个新的Bean实例。
request在一次HTTP请求中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅会在当前的HTTP Request内有效。
session在一次新的HTTP Session中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅会在当前的HTTP Session内有效。
globalSession在一个全局的HTTP Session中,容器会返回该Bean的同一个实例。仅在protlet上下文时有效。
application为每个ServletContext对象创建一个实例。仅在Web相关的ApplicationContext中生效。
websocket为每个websocket对象创建一个实例。仅在Web相关的ApplicationContext中生效。

singleton作用域测试

在项目中,创建一个包,包中创建一个Scope类,该类不需要写任何方法。然后在该包中创建一个配置文件beans4.xml。最后在包中创建一个测试类ScopeTest,来测试singleton作用域。

/*beans4.xml配置文件内容*/
<bean id="scope" class="my.scope.Scope" scope="singleton"/>

/*ScopeTest.java测试类内容*/
package my.scope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ScopeTest{
    public static void main(String[] args){
            //定义配置文件路径
            String xmlPath = “my/scope/beans4.xml”;
            //加载配置文件
   ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        //输出获得实例
           System.out.println(applicationContext.getBean("scope")); 
            System.out.println(applicationContext.getBean("scope"));   
        }
}




/*执行后,控制台结果为

my.scope.Scope@e9a892
my.scope.Scope@e9a892

两次结果相同,说明Spring容器只创建了一个Scope类的实例。
当beans4.xml文件中不设置 scope="singleton"时,也可以,因为Spring默认作用域为singleton
*/

prototype作用域

对需要保持会话状态的Bean应使用prototype作用域。在使用prototype作用域时,spring容器会为每个Bean请求都创建一个新的实例。

/*beans4.xml配置文件内容*/
<bean id="scope" class="my.scope.Scope" scope="prototype"/>

/*ScopeTest.java测试类内容*/
package my.scope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ScopeTest{
    public static void main(String[] args){
            //定义配置文件路径
            String xmlPath = “my/scope/beans4.xml”;
            //加载配置文件
   ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        //输出获得实例
           System.out.println(applicationContext.getBean("scope")); 
            System.out.println(applicationContext.getBean("scope"));   
        }
}




/*执行后,控制台结果为

my.scope.Scope@fbd816
my.scope.Scope@2bcfcb

两次结果不相同,说明Spring容器只创建了两个Scope类的实例。
*/

注意:此时当beans4.xml文件中不设置 scope="singleton"时,不可以,因为Spring默认作用域为singleton,而并非prototype。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值