2009-01-14 19 views
16

Cuando llamo al getBean(name) en un BeanFactory, obtengo una instancia del bean definido en el contexto de la aplicación. Sin embargo, cuando llamo de nuevo al getBean(name) (con el mismo nombre) obtengo la misma instancia del bean. Entiendo cómo sería deseable en algunos (¿muchos?) Casos, pero ¿cómo le digo al BeanFactory que me proporcione una nueva instancia?¿Cómo obligo a un contenedor de resorte a no devolver una instancia única de un bean?

Ejemplo de configuración de la primavera (concisamente ... He dejado de lado algún nivel de detalle, pero esto debe obtener el punto de):

<beans> 
    <bean id="beanA" class="misc.BeanClass"/> 
</beans> 

Ejemplo de Java:

for(int i = 0;i++;i<=1) { 
    ApplicationContext context = ClassPathXmlApplicationContext("context.xml"); 
    Object o = context.getBean("beanA"); 

    System.out.println(o.toString()); // Note: misc.BeanA does not implement 
             // toString(), so this will display the OOID 
             // so that we can tell if it's the same 
             // instance 
} 

Cuando ejecuto esto , Obtengo algo así como:

[email protected] 
[email protected] 

Tenga en cuenta que ambos tienen el mismo OOID ... así que estas son las mismas instancias ... pero yo quería diferentes instancias.

Respuesta

33

tiene que decirle a la primavera que desea un grano de prototipo en lugar de un grano de Singleton

<bean id="beanA" class="misc.BeanClass" scope="prototype"/> 

Esto le dará una nueva instancia con cada solicitud.

+0

Esto lo hizo. Dos cosas me descarrilaron: 1. Inicialmente, estaba buscando un argumento para getBean (String), en lugar de un atributo en la configuración ... 2. En Spring 1.x (mi experiencia anterior de primavera), el atributo se llamaba ' singleton ', pero aparentemente no funciona en 2.5. – Jared

+0

Sí, lo cambiaron a "alcance" en Spring 2.x para acomodar solicitud, sesión y sesión global. – duffymo

+0

Si está configurando a través de la clase Java ('@ Configuration') puede' usar @Scope ("prototype") 'en el método de definición de bean –

14

El valor predeterminado scope es singleton, pero puede establecerlo en prototipo, solicitud, sesión o sesión global.

+1

+1 para el enlace de doc. Gracias. – Jared

Cuestiones relacionadas