2010-01-18 26 views
8

Spring hace DI y crea objetos para que su programa no tenga que preocuparse de crear objetos. Pero la pregunta aquí es cuando se crea una instancia de objeto inyectado. Es cuando el programa principal hace uso de la instancia o en el momento en que se crea una instancia del programa principal.Cuando Spring crea instancias de objetos que se inyectan

Respuesta

12

Todos los beans en el contexto se instancian, se inyectan y se inicializan cuando se inicia el contexto. Para cuando se recupera el primer frijol del contexto, todos los frijoles están listos para su uso.

Hay dos cosas que pueden impedir que un grano que se inicializa en el contexto pone en marcha:

  • Un grano tiene frijol configurado con un different scope (como prototype, request o session), utilizando el atributo scope="xyz"
  • Un bean ha sido marcado con lazy-init="true", en cuyo caso solo se creará una instancia cuando se solicite explícitamente, o si se requiere como una dependencia de algún otro bean.
+3

¡tienes razón! Un bean no singleton no se creará inmediatamente. +1 – nanda

+0

Gracias skaffman, eso aclara mi duda. De modo que depende del programador decidir si un frijol debe inicializarse o inicializarse de manera lenta. Esto podría ser muy subjetivo, pero ¿podría informarme sobre las mejores prácticas seguidas en este tipo de situaciones? –

+0

Es completamente subjetivo, sí, pero también lo es el resto de la construcción del software. Esto no es diferente Pero su posición predeterminada debe ser no perezosa y alcance predeterminado. Solo haz un frijol si tienes una muy buena razón. – skaffman

2

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init

Por defecto, las implementaciones applicationContext ansiosamente crear y configurar todos los granos simples como parte del proceso de inicialización. En general, esta preinstalación es deseable, ya que los errores en la configuración o en el entorno se descubren de inmediato, en lugar de horas o incluso días más tarde. Cuando este comportamiento no es deseable, puede evitar la creación de instancias previas de un bean singleton marcando la definición del bean como iniciada en modo perezoso. Un bean inicializado de forma diferida le dice al contenedor IoC que cree una instancia de bean cuando se solicite por primera vez, en lugar de al inicio.

4

En un comentario, el OP escribe:

Por lo tanto, es responsabilidad del programador para decidir si un grano tiene que ser inicializado o inicializado por adelantado con pereza. Esto podría ser muy subjetivo, pero ¿podría informarme sobre las mejores prácticas seguidas en este tipo de situaciones?

Sí, le corresponde al programador (o integrador de sistema) decidir.

No existen realmente reglas de "mejores prácticas" para decidir. Piénsalo de esta manera:

  • Si se declara un grano tan perezosamente inicializado cuando siempre se necesitará una instancia, es muy posible que el proceso de arranque lento.

  • Si declara que un bean se inicializó con impaciencia cuando no siempre es necesario, hará que el proceso de inicio sea más lento y es posible que utilice más memoria. En el peor de los casos, la creación del bean innecesario puede incluso provocar que el inicio falle.

En resumen, debe comprender su aplicación.

+0

+1 agradezco el consejo "en resumen, debe comprender su solicitud". – asgs

Cuestiones relacionadas