2012-05-13 18 views
8

Por defecto, el Bean creado por Spring es singleton. Son seguros para subprocesos porque son apátridas. Cuando queremos que Spring cree un Bean con estado, necesitamos usar el alcance del prototipo para la definición de Bean. Necesitamos ocuparnos de los problemas de seguridad de subprocesos para ellos. Todo Bean sin estado se contaminará cuando se les inyecte el prototipo de frijol. Entonces, no puedo imaginar dónde podemos usar el alcance del prototipo. ¿Puedes darnos un escenario típico de que podemos/necesitamos usar el prototipo Spring Bean? Además, ¿cómo podemos anular la contaminación con estado en otros granos de singleton?¿Para qué se utiliza el prototipo Spring Bean?

Respuesta

12

Existen muchas razones para usar el alcance del prototipo, por ejemplo, cada vez que use "nuevo" en lugar de utilizar un singleton. Un bean por usuario, un bean por solicitud, una colección de beans únicos, etc. Después de todo, en cualquier aplicación no trivial, ¿no usa non-singletons mucho más que singletons?

granos de ámbito-Singleton no son seguras para subprocesos simplemente porque son únicos – deben ser escritos a ser flujos seguros. No se vuelven seguros a hilos mágicamente. El alcance de un bean es solo eso, su alcance: no hace que el bean sea apropiado para el alcance particular – que corresponde al desarrollador.

+0

Tengo que estar en desacuerdo con mi buen amigo Dave aquí. Personalmente, tuve 0 buenos motivos para crear un prototipo de Spring Bean en cualquiera de mis aplicaciones de producción. Me preguntaría por qué necesita este objeto como un frijol. Si se trata realmente de un objeto con estado, ¿se trata de un Bean de entidad creado por JPA o JDBC de modo que no se llame nuevo de todos modos? Es un objeto similar a View DTO, de nuevo solo llame a new allí. Aquí hay un enlace a Marten diciendo lo mismo .. http://forum.spring.io/forum/spring-projects/container/81737-when-to-set-scope-as-prototype – user1567291

+0

Explicaciones sobre votos a la baja, particularmente cuando la respuesta es correcta, completa y aceptada, generalmente es una buena idea. –

1

Percibo el prototipo de alubias como una alternativa a las clases de fábrica utilizadas para crear objetos. La diferencia es que en el caso del prototipo, los frijoles spring le ahorrarán un poco de código para la inyección de dependencias y también proxy automáticamente sus objetos para las transacciones, etc., cuando corresponda.

Yo prefiero el enfoque de fábrica. Un escenario razonable para el alcance del prototipo que encontré fue un objeto con estado, necesario para diferentes beans conocidos y cada uno requería su propia copia. Una clase de fábrica dedicada sería redundante en este escenario, ya que no necesitaba crear objetos sobre la marcha, sino solo durante la instanciación de otros beans.

Cuestiones relacionadas