`

代码讲解spring中的singleton和prototype

 
阅读更多
1. singleton
配置中的bean定义可以看作是一个模板,容器会根据这个模板来构造对象。bean定义中的scope语义会决定:容器将根据这个模板构造多少对象实例,又该让这个对象实例存活多久。标记为拥有singleton scope的对象定义,在Spring的IoC容器中只存在一个对象实例,所有该对象的引用都共享这个实例。该实例从容器启动,并因为第一次被请求而初始化之后,将一直存活到容器退出,也就是说,它与IoC容器“几乎”拥有相同的“寿命”。
下图是Spring参考文档中给出的singleton的bean的实例化和注入语义示意图,或许更能形象得说明问题。
 

Spring中的bean默认是singleton的,下面这两种写法的效果相同:


<bean id="accountService" class="com.foo.DefaultAccountService"/>
<!-- the following is equivalent, though redundant (singleton scope is the default) -->
<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>

代码说明:
public class CustomerService 
{
	String message;
	
	public String getMessage() {
		return message;
	}

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


<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-2.5.xsd">

       <bean id="customerService" 
            class="com.mkyong.customer.services.CustomerService" />
		
</beans>

 public static void main( String[] args )
    {
    	ApplicationContext context = 
    	 new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});

    	CustomerService custA = (CustomerService)context.getBean("customerService");
    	custA.setMessage("Message by custA");
    	System.out.println("Message : " + custA.getMessage());
    	
    
    	CustomerService custB = (CustomerService)context.getBean("customerService");
    	System.out.println("Message : " + custB.getMessage());
    }


    则输出结果都是一样的:
Message : Message by custA
Message : Message by custA

这里由于默认是单例,只要从容器中取,其实都是其中的同一个实例

2)prototype
  针对声明为拥有prototype scope的bean定义,容器在接到该类型对象的请求的时候,会每次都重新生成一个新的实例对象给请求方。虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回请求方之后,容器就不再拥有当前返回对象的引用,请求方需要自己负责当前返回对象的后继的声明周期的管理工作,例如该对象的销毁。也就是说,容器每次返回给请求方一个新的实例对象后,就任由这个对象“自生自灭”了。
对于那些请求方不能共享使用的对象类型,应该将其bean定义的scope设置为prototype。这样,每个请求方可以得到自己专有的一个对象实例。通常,声明为prototype的对象都是一些有状态的,比如保存每个顾客信息的对象。
从Spring参考文档下的这幅图片,可以再次了解prototype scope的bean定义,在实例化对象和注入依赖的时候,它的具体语义是什么样子。
[img]
http://upload-images.jianshu.io/upload_images/44770-6e4899d92cda505a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
[/img]

用以下两个ban定义的效果是一样的:

<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/>
<bean id="accountService" class="com.foo.DefaultAccountService" singleton="false"/>


代码讲解,同样上面的例子:
 
Message : Message by custA
Message : null


   在prototype中,每次调用getbean,都生成新的实例
分享到:
评论

相关推荐

    简单了解spring bean作用域属性singleton和prototype的区别

    Spring Bean作用域属性singleton和prototype的区别详解 Spring Framework中,Bean的作用域属性是指Bean实例的生命周期和作用域。Spring提供了五种作用域:singleton、prototype、request、session和global session...

    spring6pdf详细讲解

    Spring 提供了多种方式来解决循环依赖问题,包括使用 singleton 和 prototype 等范围的 Bean。 在 Spring 中,反射机制是框架的核心技术之一。反射机制使得开发者可以在运行时动态地访问和操作对象的属性和方法。 ...

    详解Spring中bean的作用域

    在 Spring 中,bean 的作用域可以分为五种:singleton、prototype、request、session 和 global session。这五种作用域类型决定了 bean 的实例化和生命周期的管理方式。 1. Singleton 作用域 Singleton 作用域是...

    详解Spring中bean的scope以后使用

    本文详细介绍了Spring框架中Bean的几种作用域及其配置方法,包括Singleton、Prototype、Request、Session和Global Session等。每种作用域都有其适用场景,开发者应根据具体的应用需求选择合适的作用域。合理地利用...

    详解Spring中Bean的生命周期和作用域及实现方式

    Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...

    传智播客2016spring资料4

    2. **Spring Bean**:介绍Spring容器如何创建、初始化、配置和管理Bean,以及Bean的作用域(如Singleton、Prototype等)。 3. **AOP**:讲解面向切面编程的概念,如何在不修改源代码的情况下,实现对程序行为的统一...

    Spring之scope讲解测试示例代码

    在提供的示例代码中,你可能看到了如何在Spring配置文件中定义这些scope,以及如何在Java代码中注入和使用这些Bean。`main`函数可能用于非Web环境下的测试,而Web工程部分则展示了如何在Web应用中使用Bean。 在...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ClassPathResource 4.3.3. FileSystemResource 4.3.4...

    Spring_IOC详解.pdf

    ### Spring_IOC详解:深入探索Spring框架的IOC容器原理 #### 引言 Spring框架作为Java企业级应用开发的基石,其核心组件之一便是IOC(Inverse of Control)容器。IOC容器负责管理应用程序中的对象及其依赖关系,...

    spring技术详解

    Spring容器中Bean的作用域有四种:singleton、prototype、request和session。singleton是单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。prototype是原型模式,每次通过容器的getBean...

    springioc的详细讲解

    4. **Bean的作用域**:Spring提供了多种Bean的作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)和全局会话(Global Session)。这允许我们根据需求选择合适的Bean生命周期。 5...

    《精通Spring2.x-企业应用开发详解》源代码

    《精通Spring2.x-企业应用开发详解》这本书深入剖析了Spring框架的核心特性和在实际企业应用中的使用方式。源代码涵盖了第二至第六章的内容,这五个章节分别涉及了Spring的基础、依赖注入、AOP(面向切面编程)、...

    详尽的Spring2.0学习提纲

    Spring 2.0是Java开发中的一个里程碑,它在企业级应用开发中扮演着至关重要的角色,特别是对于依赖注入(IoC)和面向切面编程(AOP)的支持。本学习提纲旨在为初学者提供一份详尽的Spring 2.0学习指南,帮助他们系统...

    spring3注解详解

    以上是Spring 3.0中的一些核心注解,它们极大地提高了开发效率和代码可读性。理解并熟练使用这些注解,能让你在Spring框架的开发中游刃有余。在实际项目中,你需要根据需求灵活应用,以实现高效、简洁的代码结构。

    spring 配置文件详解

    3. Bean 生产和实例分发:在 Spring 配置文件中,可以定义 Bean 的生产和实例分发策略,例如 singleton、prototype 等。Spring 容器将根据配置文件中的定义,生产和分发 Bean 实例。 下面是一个比较完整的 Spring ...

    Spring in Action(第二版)中文版.pdf(2-3)

    IoC是Spring的核心设计理念,它将对象的创建和管理从应用程序代码中解耦出来,提高了代码的可测试性和可维护性。DI则是实现IoC的一种方式,通过容器来管理对象的生命周期和相互依赖关系,使得代码更加灵活和松散耦合...

    spring学习笔记(3.20)

    2. **Spring Bean**:讲解如何定义和配置Bean,以及Bean的作用域(singleton、prototype等)和生命周期管理。 3. **BeanFactory与ApplicationContext**:比较两者之间的差异,解释何时使用BeanFactory以及何时升级...

    spring2.5开发参考手册

    此外,手册会深入讲解Spring的Bean管理,包括Bean的生命周期、初始化方法、销毁方法以及各种Scope(如Singleton、Prototype)。同时,它还会介绍XML和注解配置两种方式,让开发者可以根据项目需求选择合适的配置方式...

    Spring中文帮助文档

    3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-based)的配置 3.11.1. @Autowired 3.11.2. 基于注解的自动连接微调 3.11.3. ...

Global site tag (gtag.js) - Google Analytics