Spring Singleton VS prototype

    在Spring中,bean的作用域范围有5种,它们是[singleton,prototype,request,session,globalSession],其中singleton是默认值。

    在大多数情况下,我们只和singleton和prototype打交道。那么,它们之间有什么区别呢?

    singleton: 如单例模式一样,调用getBean()方法试图从IoC容器中返回唯一的实例

    prototype:每次调用getBean()方法,都从IoC容器中返回一个新建的实例


    看看下面的一个实例:

    首先定义一个CustomerService类。

package org.spring.scope;

public class CustomerService {

	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
}


    在Spring的bean配置文件中定义一个作用域为singleton的bean(因为singleton是默认值,因此不写也行):

<?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">

    <bean id="customer" class="org.spring.scope.CustomerService" scope="singleton" />
</beans>

运行它吧!

package org.spring.scope;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"SpringConfig.xml"});
		
		CustomerService custA = (CustomerService)context.getBean("customer");
    	custA.setMessage("Message by custA");
    	System.out.println("Message : " + custA.getMessage());
 
    	//重新获取一遍
    	CustomerService custB = (CustomerService)context.getBean("customer");
    	System.out.println("Message : " + custB.getMessage());
	}
}

打印信息:

Message : Message by custA
Message : Message by custA


看吧,果然是同一个bean。


如果把Spring的bean配置文件中的作用域修改为prototype:

...
    <bean id="customer" class="org.spring.scope.CustomerService" scope="prototype" />
...

再运行main:

Message : Message by custA
Message : null

第二个消息为null,说明该bean不是之前获取的那个bean,而是在IoC容器新建的一个新bean。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值