2012-06-08 25 views
5

Poco a poco me he estado familiarizando con Spring por un tiempo y creo que tengo una idea razonable de los conceptos; sin embargo, encontré información en otro de mis hilos que puso las cosas patas arriba. me ...Spring Prototype Beans y beneficios de Spring

" ... aunque los métodos de inicialización del ciclo de vida de devolución de llamada se llaman en todos los objetos independientemente de su alcance, en el caso de los prototipos, las devoluciones de llamada de ciclo de vida de destrucción configurado no se llaman. el código de cliente debe limpiar prototipo examinó los objetos costosos y libera recursos costosos que el bean (s) prototipo está reteniendo. Para que el contenedor Spring libere los recursos que contienen los beans de ámbito prototipo, intente usar un postprocesador de bean personalizado, que contiene una referencia a beans que n eed para ser limpiado ".

Esto me hizo pensar que tengo casos de uso real en los que me gustaría usar prototipos de frijoles en los que, por ejemplo, necesito una "nueva" instancia de frijol por solicitud. Sin embargo, por lo que entiendo de este fragmento (de Spring 3 docs), Spring mantiene una referencia a los beans que deben limpiarse (la referencia misma significa que el recolector de basura no eliminará automáticamente el bean). Además, tomo de esto que los recursos mantenidos por el prototipo de frijol deben ser limpiados manualmente.

¿Alguien me puede decir si esto es correcto? Si es así, ¿existe un patrón típico para tratar con esto? Agradecería una respuesta que podría describir la razón arquitectónica por la cual Spring implementa prototipos de frijoles de esta manera.

+1

En caso de que necesite que con ámbito de solicitud Puede solicitar ámbito de usuario;) http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference /html/ch04s04.html –

+0

@Spaeth Lo siento, pude haber sido engañoso ... esta no es una aplicación web, solo estaba tratando de demostrar la necesidad de crear una nueva instancia para manejar "algo" que esté sucediendo – JLove

Respuesta

13

El muelle se aferra a una referencia a los granos que deben limpiarse (la referencia misma significa que el bean no se borrará automáticamente por el recolector de basura).

Sí, pero el contenedor no contiene referencias a los granos del ámbito del prototipo. Esta es la razón por la que no se llaman las devoluciones de llamadas de destrucción: Spring crea una instancia de bean, la conecta y llama a callbacks de construcción. Da una instancia y se olvida de ese bean.

Puede crear de manera segura beans con un tamaño de prototipo por solicitud. Spring te dará una instancia y en el momento en que no tengas ninguna referencia a ese bean (¡Spring no guarda uno!), Será basura recolectada. Pero dado que Spring no sabe nada sobre tu bean después de haberlo creado, no puede invocar ninguna devolución de destrucción. De hecho, esto se reduce a una pregunta: por qué Java no tiene destructores.

Entonces, ¿cómo se limpian los granos del prototipo? Bueno, al igual que limpiar cualquier otro recurso en Java, explícitamente. Proporcione close(), destroy(), stop() o el nombre que desee (considere implementar Closeable. Tenga en cuenta que tales métodos no son necesarios. El recolector de basura publicará todo el gráfico del objeto mientras que las conexiones de bases de datos persistentes se cerrarán cuando se cierre el DataSource completo.

+1

Gracias por ti responda ... esta fue la forma en que creí que funcionaba antes de leer este fragmento, ¡quizás acabo de malinterpretarlo! Básicamente ... continuar como antes, dejando un rastro de destrucción, y todo se limpiará detrás de mí :-) – JLove

7

Se interpretan mal la documentación Se explícitamente dice:.

para obtener el contenedor de resorte para liberar recursos en poder de granos prototipo con ámbito, trate de usar un post-procesador de grano de costumbre, que contiene una referencia a frijoles que necesitan ser c se inclinó hacia arriba.

So Spring no contiene ninguna referencia a los prototipos de frijoles que crea. Depende de usted crear un postprocesador de frijol que contenga referencias a estos frijoles si es necesario.

Además, es bastante raro que los beans prototipo contengan recursos que deben limpiarse. Por ejemplo, un grupo de conexiones (que debe destruirse adecuadamente al apagar) suele ser un bean singleton. No tendría mucho sentido convertirlo en un prototipo. Dado que los beans prototipo se usan a menudo durante un período de tiempo reducido, el cliente que lo crea puede liberar explícitamente sus recursos cuando ya no los usa. Al igual que cuando creas una nueva transmisión o conexión, y la cierras en un bloque finally.

3

Spring no tiene conocimiento de todas las instancias creadas con el alcance del prototipo. Simplemente instanciará y configurará los beans de ámbito prototipo y se los entregará al cliente tal como se comentó en la documentación.

primavera no gestiona el ciclo de vida completo de un grano de prototipo: el contenedor crea una instancia, configura, decora y de otra manera ensambla un objeto prototipo, se la entrega al cliente y no tiene más conocimiento de esa instancia prototipo .

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html#beans-factory-scopes-prototype

Cuestiones relacionadas