que mvc example ejemplo component bean anotaciones spring instance

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.