初学Spring——Bean的作用域(singleton单例+prototype原型)
程序员文章站
2022-05-24 10:56:20
...
什么是Bean?
Bean是指 项目中提供业务功能的Bean ,也就是容器要管理的Bean。Bean就是一个常见的JavaBean、Java类。
Bean的两种常用作用域
什么是作用域?
土里来,土里去。个人认为作用域就是bean的应用范围。有的bean能够长长久久的使用,而有的bean使用一次就丢掉了。这类似于servlet里面的request和session。request能够在一次或者多次转发中使用,到最后也就一个页面用一次,出去这个页面你就获取不到这个request了;而session是在你不关闭网页的前提下持续使用。
小试一下
在不改变任何bean的配置下,先执行一遍默认的创建步骤。
- 创建类Scope.java
package com.dz.scope;
public class Scope {
//里面没有任何内容
}
- 将Scope类装配到容器中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--scope装配到容器中-->
<bean id="scope" class="com.dz.scope.Scope"></bean>
</beans>
- 创建测试类TestScope.java
public class TestScope {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//调用Spring容器里面的对象
System.out.println("第一次调用:"+ac.getBean("scope",Scope.class));
System.out.println("第二次调用:"+ac.getBean("scope",Scope.class));
}
}
- 控制台输出结果
显而易见的,在Spring容器中装配的Scope类,调用获取两次的情况下输出地址相同,所以使用的是一个对象。
singleton作用域
在上面的基础上,对配置文件的bean做一下改变
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--scope装配到容器中,并加一个scope属性=“singleton”-->
<bean id="scope" class="com.dz.scope.Scope" scope="singleton"></bean>
</beans>
再次看控制台输出结果
地址还是相同的,所以Spring在默认的情况下创建Bean对象是单例的(singleton)。
prototype作用域
继续在上面的基础上,对配置文件的Bean进行改变
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--scope装配到容器中,并加一个scope属性="prototype"-->
<bean id="scope" class="com.dz.scope.Scope" scope="prototype"></bean>
</beans>
看控制台输出结果
很明显的地址不同了,说明在第二次的调用过程中,容器又又又创建了一个对象,这个创建过程叫做原型(prototype)。
总结
容器在调用对象的时候每次都是一样的叫做singleton单例。
容器在调用对象的时候每次都不一样的叫做prototype原型。
上一篇: 骁龙636处理器性能怎么样?高通骁龙636处理器评测
下一篇: SpringBoot配置错误信息页面