java - springframework - ¿Cómo obligo a un contenedor de resorte a no devolver una instancia única de un frijol?
spring framework tutorial (2)
Cuando llamo a getBean(name)
en un BeanFactory
, obtengo una instancia del bean definido en el contexto de la aplicación. Sin embargo, cuando vuelvo a llamar a getBean(name)
(con el mismo nombre), obtengo la misma instancia del bean. Entiendo cómo esto sería deseable en algunos (¿muchos?) Casos, pero ¿cómo le digo a BeanFactory
que me dé una nueva instancia?
Ejemplo de configuración de Spring (tersely ... He omitido algo de verbosidad, pero esto debería aclarar el punto):
<beans>
<bean id="beanA" class="misc.BeanClass"/>
</beans>
Ejemplo 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 como:
misc.BeanClass@139894
misc.BeanClass@139894
Tenga en cuenta que ambos tienen el mismo OOID ... así que estas son las mismas instancias ... pero quería instancias diferentes.
Debes decirle a Spring que quieres un prototipo de frijol en lugar de un frijol singleton
<bean id="beanA" class="misc.BeanClass" scope="prototype"/>
Esto te dará una nueva instancia con cada solicitud.
El alcance predeterminado es singleton, pero puede establecerlo en prototipo, solicitud, sesión o sesión global.