Spring scope作用域

118 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

前言

前面介绍了Spring IoC的基本使用以及IoC配置的详细介绍,这篇文章带你们理解Spring scope作用域。

scope作用域

Spring管理的bean是根据scope来生成的,表示bean的作用域,共5种。

  • singleton: 单例,表示通过Spring容器获取的bean是唯一的。
  • prototype: 多例,表示通过Spring容器获取的bean是不同的。
  • request: 请求,表示在一次HTTP请求内有效。
  • session: 会话,表示在一个用户会话内有效。
  • global session:会话层,应用在基于porlet的web应用程序中才有意义,他映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的sessionscope对待。

requestsession以及global session只适用于Web项目,绝大多数情况下,使用singletonprototype比较多。

singleton和prototype区别

我们先来看看单例模式

在Spring中bean默认是单例模式即scope=singleton,也可以自行指定。

<bean id="dog" class="com.xyj.Dog" scope="singleton">
    <property name="name" value="bob"></property>
    <property name="age" value="5"></property>
    <property name="variety" value="秋田"></property>
    <property name="host" ref="host"></property>
</bean>

然后我们获取两次dog对象,看看两个对象是否相等。

Dog dog1 = (Dog) applicationContext.getBean("dog");
Dog dog2 = (Dog) applicationContext.getBean("dog");
System.out.println(dog1 == dog2);

打印结果

true

这说明这两个对象的内存地址相同,dog1dog2是一个对象。

单例模式中,spring容器中创建的对象是唯一的,上面代码中不管取多少个dog对象,都是从同一个地址中取出来的。

如果我们将scope改成prototype会是怎样呢?

<bean id="dog" class="com.xyj.Dog" scope="prototype">
   <property name="name" value="bob"></property>
   <property name="age" value="5"></property>
   <property name="variety" value="秋田"></property>
   <property name="host" ref="host"></property>
</bean>

同样是获取两次dog对象

Dog dog1 = (Dog) applicationContext.getBean("dog");
Dog dog2 = (Dog) applicationContext.getBean("dog");
System.out.println(dog1 == dog2);

打印结果

false

这时候dog1和dog2是完全不同的两个对象。

当获取dog1时,IoC容器中会创建一个对象,当获取dog2时,IoC会创建另一个新的对象。

多例模式就是我们从Spring容器中获取的bean是不同的,而单例模式获取的bean是相同的。

多例模式创建方式:当业务代码获取对象时,才去调用无参构造去创建。

单例模式创建方式:当IoC容器加载时就创建。

这就是我们Spring中的scope作用域的常用的两种了。