2010-12-15 22 views
24
ApplicationContext ctx = new ClassPathXmlApplicationContext(
    "com/springinaction/springidol/spring-idol.xml"); 
Performer performer = (Performer) ctx.getBean("duke"); 
performer.perform(); 

En lo anterior, ¿cuándo se crean instancias de los beans, cuándo se crea ApplicationContext o cuándo se llama a getBean()?cuando se crea una instancia de un bean de resorte

Respuesta

30

Suponiendo que el bean es un singleton, y no está configurado para la inicialización perezosa, se crea cuando se inicia el contexto. getBean() simplemente lo pesca.

Los beans Lazy-init solo se inicializarán cuando se mencionen por primera vez, pero este no es el predeterminado. Los frijoles con cobertura (por ejemplo, con prototipo) también se crearán solo cuando se mencionen por primera vez.

+0

Si se usa un BeanFactory, ¿los frijoles están cargados con poca carga? –

+1

@java_geek: Bueno 'BeanFactory' es solo una interfaz, depende de la implementación que use, pero generalmente sí, lo mismo vale para la mayoría (si no todas) las implementaciones de' BeanFactory'. – skaffman

+0

@ Skaffman: Lo siento, entiendo que si bean have scope es singleton, se creará cuando se aplique new applicationContext, pero ¿cómo se prueba o no? En el prototipo que llamo getBeanDefinitionNames, todavía aparece – Adam

11

De acuerdo con la primavera documentation,

El comportamiento por defecto para las implementaciones applicationContext es ansiosamente pre-instantiate todos los granos únicos en el arranque.

Además, puede configurarlas para que se carguen de forma lenta.

+0

, que es el comportamiento de los beans singleton. pero cuál es el comportamiento de los beans normales –

+2

@java_geek: Singletons * son * normales. ellos son los predeterminados ¿Qué es normal para ti? – skaffman

+0

quería saber si singleton = false está establecido para el bean –

9

Como referencia, ver

He aquí una breve descripción de cuándo se crean los granos:

  • Un grano de Singleton (que es el valor por defecto ámbito) que no tiene la propiedad lazy-init establecida en verdadero (el valor predeterminado es f alse) se construye cuando se crea el contexto de aplicación
  • Un grano de singleton que tiene el conjunto de propiedades lazy-init a verdadero se construye cuando se solicita primero
  • Un grano de establecer en cualquier otro ámbito se crea cuando es primero solicitado (para ese alcance).
1
  1. Por defecto, todos los granos son únicos, por lo que cada vez que se crea el contexto de aplicación, todos ellos son pre-cargadas. Si, específicamente, cualquier bean singleton tiene un atributo lazy-init = "true" establecido, se cargará de forma diferida, es decir, se instanciará cuando se invoque el método getBean por primera vez.

  2. Para otros ámbitos, los beans se instanciarán siempre que se soliciten.

Cuestiones relacionadas