3Bean对象的单例和多例

本文介绍了Spring容器中Bean对象的单例(singleton)和多例(prototype)作用域。单例模式确保全局只有一个实例,而多例模式每次请求都会创建新的对象。使用单例可以避免不必要的资源消耗,多例则用于防止并发问题。通过在Spring配置文件中设置bean的scope属性,可以切换Bean的作用域。通过测试类TestIOC2展示了单例和多例的运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Bean对象的单例和多例概述

  在Spring容器中管理的Bean对象的作用域,可以通过scope属性或用相关注解指定其作用域。最常用是singleton(单例)或prototype(多例)。其含义如下:
  1.singleton:单实例,是默认值。这个作用域标识的对象具备全局唯一性。当把一个 bean 定义设置scope为singleton作用域时,那么Spring IOC容器只会创建该bean定义的唯一实例。也就是说,整个Spring IOC容器中只会创建当前类的唯一一个对象。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都 将返回被缓存的、唯一的这个对象实例。singleton负责对象的创建、初始化、销毁。

  2.prototype:多实例。这个作用域标识的对象每次获取都会创建新的对象。当把一个 bean 定义设置scope为singleton作用域时,Spring IOC容器会在每一次获取当前Bean时,都会产生一个新的Bean实例(相当于new的操作)prototype只负责对象的创建和初始化,不负责销毁。Bean对象的单例和多例

二、为什么用单实例或多实例

  之所以用单实例,在没有线程安全问题的前提下,没必要每个请求都创建一个对象,这样子既浪费CPU又浪费内存;
  之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态(例如,可改变的成员变量),此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
  用单例和多例的标准只有一个:当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),使用多实例,否则单实例。
在Spring中配置Bean实例是单例还是多例方法是:
单例:

<bean id="hello" scope="singleton" class="com.tedu.spring.Hello"></bean>

多例:

<bean id="hello" scope="prototype" class="com.tedu.spring.Hello"></bean>

三、测试spring的单实例和多实例

1.创建TestIOC2类,测试代码如下:

package com.company.spring;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestIOC2 {
	public static void main(String[] args) {
		/* 通过spring容器创建创建Hello对象,
		 * 并调用Hello中的sayHi方法  */
		//1.加载spring的核心配置文件
		ClassPathXmlApplicationContext ac = 
				new ClassPathXmlApplicationContext(
					"applicationContext.xml"
				);
		//2.从spring容器中获取bean对象(而不是自己new)
		Hello hello1 = (Hello) ac.getBean("hello");
		Hello hello2 = (Hello) ac.getBean("hello");
		
		//3.测试
		if(hello1 == hello2){
			System.out.println("当前实例为单实例...");
		}else{
			System.out.println("当前实例为多实例...");
		}
	}
}

2.将applicationContext.xml中,Hello类bean标签的scope值设置为singleton:

<bean id="hello" scope="singleton" class="com.tedu.spring.Hello"></bean>

运行TestIOC2,运行结果为:
在这里插入图片描述

3.将applicationContext.xml中,Hello类bean标签的scope值修改为prototype

<bean id="hello" scope="prototype" class="com.tedu.spring.Hello"></bean>

再次运行TestIOC2,运行结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值