持续创作,加速成长!这是我参与「掘金日新计划 · 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,容器会把它作为普通的session的scope对待。
request和session以及global session只适用于Web项目,绝大多数情况下,使用singleton和prototype比较多。
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
这说明这两个对象的内存地址相同,dog1和dog2是一个对象。
单例模式中,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作用域的常用的两种了。