欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

初学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的配置下,先执行一遍默认的创建步骤。

  1. 创建类Scope.java
package com.dz.scope;

public class Scope {
//里面没有任何内容
}

  1. 将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>
  1. 创建测试类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));		
	}
}
  1. 控制台输出结果

初学Spring——Bean的作用域(singleton单例+prototype原型)
显而易见的,在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原型)
地址还是相同的,所以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>

看控制台输出结果
初学Spring——Bean的作用域(singleton单例+prototype原型)
很明显的地址不同了,说明在第二次的调用过程中,容器又又又创建了一个对象,这个创建过程叫做原型(prototype)。

总结

容器在调用对象的时候每次都是一样的叫做singleton单例。
容器在调用对象的时候每次都不一样的叫做prototype原型。