¿Tener muchos beans no utilizados en un contexto Spring Bean desperdicia recursos importantes?

StackOverflow https://stackoverflow.com/questions/98320

  •  01-07-2019
  •  | 
  •  

Pregunta

Mi capa de modelo está siendo utilizada por varios proyectos diferentes y me gustaría usar un único archivo XML Spring Configuration para el modelo, independientemente de qué proyecto lo esté usando.

Mi pregunta es:Dado que no todos los beans se utilizan en todos los proyectos, ¿estoy desperdiciando recursos en una cantidad significativa si no se crean instancias?No estoy muy seguro de qué tan perezoso es Spring a la hora de cargarlos, ya que nunca ha sido un problema hasta ahora.

¿Algunas ideas?

¿Fue útil?

Solución

Tomado de la Manual de referencia de primavera:

El comportamiento predeterminado para las implementaciones de ApplicationContext es crear instancias previas de todos los beans singleton al inicio.La creación previa de instancias significa que un ApplicationContext creará y configurará con entusiasmo todos sus beans singleton como parte de su proceso de inicialización.En general, esto es algo bueno, porque significa que cualquier error en la configuración o en el entorno circundante se descubrirá inmediatamente (en lugar de posiblemente horas o incluso días después).

Sin embargo, hay ocasiones en las que este comportamiento no es el deseado.Si no desea que se creen instancias previas de un bean singleton cuando utiliza un ApplicationContext, puede controlar esto selectivamente marcando una definición de bean como inicializada de forma diferida.Un bean inicializado de forma diferida indica al contenedor de IoC si se debe crear o no una instancia de bean al inicio o cuando se solicita por primera vez.

Al configurar beans a través de XML, esta carga diferida está controlada por el atributo 'lazy-init' en el [elemento bean];Por ejemplo:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>

Pero, a menos que sus beans estén consumiendo recursos como bloqueos de archivos o conexiones de bases de datos, no me preocuparía demasiado por la simple sobrecarga de memoria si le resulta más fácil tener esta configuración para múltiples (pero diferentes) perfiles.

Otros consejos

Además de los otros comentarios:También es posible especificar un archivo de configuración completo para que se inicialice de forma diferida, utilizando el atributo 'default-lazy-init' en el <beans/> elemento;Por ejemplo:

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

Esto es mucho más fácil que agregar el lazy-init atribuye a cada frijol, si tienes muchos.

De forma predeterminada, los Spring beans son singleton y se crean instancias cuando se crea el contexto de la aplicación (al inicio).Entonces, suponiendo que no haya anulado el comportamiento predeterminado, se creará una única instancia de cada bean.

Depende de los objetos.

Pero el código no utilizado es "crudo" y aumentará el costo de mantenimiento.

Es mejor eliminar las referencias y las clases.Siempre puedes restaurar desde el control de versiones si es necesario más adelante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top