`
chillwarmoon
  • 浏览: 155330 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring加载singleton Bean的时候,发现两个实例。

阅读更多
目的:想在内存中加载一个单态队列。
做法:该队列做为spring的一个singleton Bean加载到Spring Container当中,在业务逻辑中,将对象装在单态队列中,获取队列中的元素是在Servlet中获取的,Servlet也是通过Spring DI得到的这个队列。
问题:但是这两个队列并不一样,前者在队列中装了一些元素,后者得到的队列却不包含任何元素。不知道是为什么,难道Spring Container和Servlet Container是分开的吗?

参考:看了一下spring的references,是这样说的:
Please be aware that Spring's concept of a singleton bean is quite different from the Singleton pattern as defined
in the seminal Gang of Four (GoF) patterns book. The classic GoF Singleton hardcodes the scope of an object
such that one and only one instance of a particular class will ever be created per ClassLoader. The scope of the
Spring singleton is best described as per container and per bean. This means that if you define one bean for a
particular class in a single Spring container, then the Spring container will create one and only one instance of
the class defined by that bean definition.
分享到:
评论
3 楼 qqdwll 2011-09-01  
:-) 比较清楚了。
2 楼 chillwarmoon 2007-07-04  
问题解决了,自问自答吧。
关于spring的singleton pattern的问题有一篇文章介绍的挺好,http://www.digizenstudio.com/blog/2006/09/14/a-spring-singleton-is-not-a-singleton/  这里说spring singleton is not a singleton是指spring的单态和GOF的单态是不同的,spring的单态只是在spring容器里边保存一个实例,但是如果有
      <bean id="foo1" class="Foo" singleton="true">
      </bean>
      <bean id="foo2" class="Foo" singleton="true">
      </bean>

则在容器中建立两个实例,显然和GOF的单态是不同的,GOF的单态只要保证是一个ClassLodader,那么其中对应每一个类就仅有一个实例。

所以决定将项目中的队列改成GOF的单态模式,去掉spring的DI,然后发现两次访问队列还不是一个实例,而此时的ClassLoader是相同的,再检查spirng的配置文件,发现有对队列Bean的定义,去掉之后,解决问题。
1 楼 chillwarmoon 2007-07-04  
问题阐述的不清楚吗?怎么没有一个人回帖的。

相关推荐

    Spring Bean重复执行两次(实例被构造两次)问题分析

    在Spring容器初始化时,它会根据配置加载Bean的定义,并根据需要创建Bean实例。Bean的生命周期大致分为以下几个阶段:构造、初始化、正常使用、销毁。如果一个Bean被创建了两次,那么可能是在构造或初始化阶段出现了...

    Spring实例化Bean顺序

    4. **启动后处理器(BeanPostProcessor)**:这些是特殊类型的Bean,它们在所有常规Bean实例化之后,但初始化之前进行处理。它们的实例化顺序由`@Order`注解决定,或者通过实现`Ordered`接口来控制。 5. **...

    singleton Bean 创建 prototype Bean

    2. 容器会立即创建这些Singleton Bean实例,并将其保存在一个内部缓存中,这个过程称为早期初始化。 3. 当其他Bean需要依赖这个Singleton Bean时,容器直接从缓存中取出已创建的实例,无需再次创建。 Prototype ...

    Spring Bean 加载顺序 .

    Spring允许自定义BeanPostProcessor,它们在Bean实例化后执行特定的处理,比如AOP代理。这些后处理器将在Bean实例化后,初始化前介入。 7. **Bean初始化**: 实例化完成后,Spring会执行Bean的初始化方法,包括...

    spring的bean加载顺序样例项目

    - 如果Bean配置了AOP代理,如`@AspectJ`切面或基于接口的代理,那么在Bean实例化后,Spring会创建代理对象,代理对象负责拦截方法调用并执行相关的切面逻辑。 6. **Bean的销毁** - 对于单例Bean,Spring容器在...

    Spring实战之Bean的作用域singleton和prototype用法分析

    在Spring框架中,Bean的作用域是决定如何管理和创建Bean实例的关键概念。本篇文章将深入探讨两种主要的作用域:singleton和prototype,并通过实例分析其用法和注意事项。 首先,`singleton`是Spring默认的作用域,...

    spring bean的生命周期

    - **Singleton**:Spring容器中只会存在一个Bean实例,所有对Bean的请求都会返回同一个实例。 - **Prototype**:每次请求都会创建一个新的Bean实例。 - **Request**:在Web应用中,每个HTTP请求都会创建一个Bean...

    spring加载顺序讨论

    在Spring框架中,加载顺序是理解应用程序启动过程的关键部分,涉及到bean的实例化、初始化以及依赖注入等多个环节。本文将详细探讨Spring加载顺序,并结合`@PostConstruct`、`构造方法`以及`@Autowired`等关键注解...

    spring中的bean

    单例Bean在整个应用中只有一个实例,而原型Bean每次请求都会创建新的实例。 7. **AOP**:面向切面编程是Spring的另一大特色,它允许我们在不修改源代码的情况下,添加额外的行为。例如,我们可以通过切面实现日志...

    Spring中与Bean相关的接口

    它提供两个方法:`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`,分别在Bean初始化之前和之后调用,可以用来进行额外的处理或校验。 在Bean的定义中,我们可以使用`@Component`、`@...

    Spring多种加载Bean方式解析

    BeanDefinition是一个接口,用来描述一个Bean实例,例如是SINGLETON还是PROTOTYPE,属性的值是什么,构造函数的参数是什么等。简单来说,通过一个BeanDefinition我们就可以完成一个Bean实例化。 BeanDefinition及其...

    spring管理bean应用实例代码

    - `singleton`:默认作用域,Spring容器中只有一个Bean实例。 - `prototype`:每次请求都会创建一个新的Bean实例。 - `request`、`session`、`globalSession`:这些是在Web应用中使用的,分别对应HTTP请求、会话...

    通俗易懂spring之singleton和prototype.docx

    Singleton模式意味着每个Bean在Spring容器中只会存在一个实例。当你通过`ApplicationContext`获取一个配置为`scope="singleton"`的Bean时,无论你调用`getBean`多少次,都会返回同一个对象实例。例如,在`UserDao`的...

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    1. **单例(Singleton)**:这是默认的作用域,Spring容器只会创建一个Bean实例,所有对Bean的请求都会返回同一个实例。 2. **原型(Prototype)**:在每次请求时,Spring容器都会创建一个新的Bean实例。 3. **...

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

    Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了Bean的生命周期和作用域的管理方式。 一、Bean的生命周期 Bean的生命周期是指Bean从创建到销毁的整个过程。这个过程可以分为九个阶段: 1. ...

    Spring bean 管理

    - singleton:默认的作用域,表示容器中只有一个Bean实例。 - prototype:每次请求都创建一个新的Bean实例。 - request:每个HTTP请求都会创建一个新的Bean实例,只适用于Web应用。 - session:在一个...

    spring bean life cycle

    1. **实例化**:Spring容器在遇到一个Bean定义时,会通过反射机制创建Bean实例。如果Bean定义中有`factory-method`属性,那么Spring会调用指定的方法来实例化Bean,而不是使用默认的构造器。 2. **属性注入**:实例...

    spring装配bean实例代码

    默认情况下,Bean是单例的(`singleton`),在整个Spring容器中只存在一个实例。还可以定义为原型(`prototype`),每次请求都会创建一个新的实例。 总结,Spring装配Bean的XML配置方式是Spring框架的基础,通过...

    Spring之核心容器bean

    主要有两个关键组件:BeanFactory和ApplicationContext。BeanFactory是Spring的基础容器,它提供bean的实例化、作用域、依赖注入、生命周期管理等功能。ApplicationContext则是在BeanFactory基础上扩展,增加了更多...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    singleton Beans 是指在 Spring 框架中每个Bean 只会被实例化一次,解决了循环依赖问题。但是,Spring 框架中不能解决非单例属性之外的循环依赖、构造器的循环依赖和prototype 作用域循环依赖。 在 Spring 框架中,...

Global site tag (gtag.js) - Google Analytics