天天看点

初学Spring——Bean的作用域(singleton单例+prototype原型)

文章目录

      • 什么是Bean?
      • Bean的两种常用作用域
        • 什么是作用域?
        • 小试一下
        • singleton作用域
        • prototype作用域
      • 总结

什么是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原型。