mvc - que es un bean en spring
Cuántas instancias creadas para el bean singleton en referencia a un bean de sesión/prototipo de bean (2)
Tengo una duda sobre la cantidad de instancias que se crearán en el escenario que se menciona a continuación, cuando se usa Spring:
La configuración del bean es así.
<bean id="a" class="A">
<property name="b" ref="b"/>
</bean>
<bean id="b" class="B" scope="session"/> or
<bean id="b" class="B" scope="prototype"/>
Por defecto, el bean "a" tiene singleton scope
. Así que hay un bean singleton con una referencia a un bean con alcance de sesión o prototipo.
En este caso, si hay 2 solicitudes simultáneas a la aplicación, ¿cuántas instancias de A se crearán y cuántas instancias de B se crearán?
¿Será de gran ayuda si alguien puede explicar cómo funciona esto?
Gracias divya
Si usamos la forma mencionada en la pregunta, la IOC de la primavera creará siempre el mismo objeto que singleton. Para inyectar un prototipo de bean dentro de singleton, tenemos dos vías.
1) Inyección del método de búsqueda
2) Proxies de ámbito
ver más detalles here
El alcance singleton.
Cuando un bean es un singleton
, solo se administrará una instancia compartida del bean, y todas las solicitudes de beans con un id o ids que coincidan con la definición del bean darán como resultado que el contenedor Spring devuelva una instancia de bean específica.
Para decirlo de otra manera, cuando define una definición de bean y tiene un ámbito como singleton
, el Spring IoC container
create exactly one instance of the object
definido por esa definición de bean. Esta instancia única se almacenará en un caché de dichos frijoles singleton, y todas las solicitudes y referencias posteriores para ese frijol nombrado darán como resultado la devolución del objeto almacenado en caché.
El alcance de la sesión
Con la definición de bean anterior en su lugar, el contenedor Spring creará una nueva instancia del bean, durante el lifetime of a single HTTP Session
.
De acuerdo con la referencia del marco de Spring, se debe seguir un enfoque diferente en los casos en los que una clase que " lives longer
" (en este caso, el frijol singleton) necesita ser inyectada con otra clase que tenga una vida útil comparativamente más corta (frijol con ámbito de sesión) . Sin embargo, el enfoque es diferente para el prototipo y el alcance de singleton.
En su XML, lo que queremos es que la instancia de singletonBean se cree una sola vez y se inyecte con sessionBean. Pero como sessionBean
tiene un ámbito de sesión (lo que significa que se debe volver a crear una instancia para cada sesión), la configuración es ambigua (ya que las dependencias se establecen en el momento de la creación de instancias y el valor del ámbito de la sesión también puede cambiar más adelante).
Entonces, en lugar de inyectar con esa clase, se inyecta con un proxy que expone exactamente la misma interfaz pública que sessionBean. El contenedor inyecta este objeto proxy en el bean singletonBean, que desconoce que esta referencia de sessionBean sea un proxy. Se especifica escribiendo esta etiqueta en el sessionBean:
<aop:scoped-proxy/>
Configuración XML:
<bean name="singletonBean" class="somepkg.SingletonBean">
<property name="someProperty" ref="sessionBean"/>
</bean>
<bean name="sessionBean" class="somepkg.SessionBean" scope="session">
<aop:scoped-proxy/>
</bean>
Cuando una instancia de singletonBean
invoca un método en el objeto sessionBean inyectado de dependencia, en realidad está invocando un método en el proxy. El proxy luego obtiene el objeto real sessionBean de (en este caso) la sesión HTTP, y delega la invocación del método en el objeto real sessionBean recuperado.
Alse por favor refiera this para más información.
Frijoles Singleton con dependencias prototipo-frijol
Método de búsqueda de inyección
Cuando utilice beans de singleton-scoped
con dependencias en prototype beans
, tenga en cuenta que las dependencias se resuelven en el momento de la prototype beans
instancias. Por lo tanto, si se inyecta una dependencia de un frijol de prototype-scoped
frijol de prototype-scoped
singleton, se crea una instancia de un nuevo frijol de prototipo y luego se inyecta la dependencia en el frijol de singleton. La instancia de prototipo es la única instancia que se ha suministrado al bean Singleton Scoped.
Sin embargo, supongamos que desea que el bean de ámbito Singleton adquiera una nueva instancia del bean de ámbito de prototipo varias veces en el tiempo de ejecución. No puede la dependencia: inyectar un bean de prototipo en su bean singleton, porque esa inyección se produce solo una vez, cuando el contenedor Spring crea una instancia del bean singleton y resuelve e inyecta sus dependencias.
<!-- a stateful bean deployed as a prototype (non-singleton) -->
<bean id="command" class="fiona.apple.AsyncCommand" scope="prototype">
<!-- inject dependencies here as required -->
</bean>
<!-- commandProcessor uses statefulCommandHelper -->
<bean id="commandManager" class="fiona.apple.CommandManager">
<lookup-method name="createCommand" bean="command"/>
</bean>
Lookup method
inyección del Lookup method
es la capacidad del contenedor para override methods on container
beans administrados override methods on container
, para devolver el resultado de búsqueda para otro bean con nombre en el contenedor. La lookup
generalmente incluye un prototype bean
como en el escenario descrito en la sección anterior. Spring Framework implementa esta inyección de método al usar la generación de CGLIB library
para generar dinámicamente una subclase que invalida el método.
Consulte el método de búsqueda de inyección .
Follow para el ejemplo y la información más detallados.