spring bean的作用域:singleton和prototype的区别

本文深入探讨Spring框架中Bean的两种作用域:singleton和prototype。通过实例展示singleton作用域下,同一ID的Bean在容器中仅有一个实例,而prototype作用域下每次请求都将创建新的Bean实例。

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

先做一个实验
xml配置文件配置一个bean

<bean id="car" class="com.beans.relation.Car">
	    <property name="brand" value="Audi"></property>
	    <property name="price" value="2222222"></property>
	</bean>

然后在运行主类里面创建两个car对象

Car car=(Car) ctx.getBean("car");
Car car2=(Car) ctx.getBean("car");
System.out.println(car==car2);

运行
在这里插入图片描述
运行结果为true,说明这两个是一样的。因为默认的是单例的。
如果改变这个bean的作用域,就是false而不是true了

<!-- 使用bean的scope属性来配置bean的作用域
	singleton:默认值,容器初始化时创建bean实例,在整个容器的生命周期内只创建一个bean,单例的
	 -->
	<bean id="car" class="com.beans.relation.Car" scope="prototype">
	    <property name="brand" value="Audi"></property>
	    <property name="price" value="2222222"></property>
	</bean>

这个bean不是单例的,就是每次向容器获取一个bean的时候都会产生一个新的bean。
我们来加深一下理解;
把bean的作用域改为singleton,然后在Car类里面写一个无参的构造方法。

public Car() {
			super();
			// TODO Auto-generated constructor stub
			System.out.println("Car's constructor....");
		}

在运行主类里面,把几行代码注释掉

ApplicationContext ctx=new ClassPathXmlApplicationContext("scope.xml");
/*Car car=(Car) ctx.getBean("car");
		    Car car2=(Car) ctx.getBean("car");
		    
		    System.out.println(car==car2);
			*/

运行发现,在创建容器的时候,bean就已经被创建好了。

在这里插入图片描述
但是在改变bean的作用域之后,改为prototype后,发现不行了,并没有语句输出。
将运行主类里面的注释拿掉。再次运行。

Car car=(Car) ctx.getBean("car");
		    Car car2=(Car) ctx.getBean("car");
		    
		    System.out.println(car==car2);

发现如下。每次生成一个新的实例,容器就会创建一个新的bean。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值