java - mvc - bean proxy de primavera
spring security web (1)
La sección 3.4.4.5 de los documentos de primavera lo explica bastante bien:
(Tenga en cuenta que la siguiente definición de bean ''userPreferences'' tal como está es incompleta):
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
A partir de la configuración anterior, es evidente que el bean ''userManager'' de singleton se está inyectando con una referencia al bean con ámbito de sesión de HTTP ''userPreferences''. El punto sobresaliente aquí es que el bean ''userManager'' es un singleton ... se creará una instancia exactamente una vez por contenedor , y sus dependencias (en este caso solo una, el bean ''userPreferences'') solo se inyectarán (¡una sola vez! )
Esto significa que el ''userManager'' operará (conceptualmente) solo en el mismo objeto ''userPreferences'', que es el que originalmente fue inyectado.
Esto no es lo que desea cuando inyecta un bean con ámbito de sesión HTTP como una dependencia en un objeto colaborador (normalmente). Por el contrario, lo que sí queremos es un solo objeto ''userManager'' por contenedor y, durante el tiempo de vida de una sesión HTTP, queremos ver y utilizar un objeto ''userPreferences'' que sea específico de dicha sesión HTTP .
Más bien, lo que necesita es inyectar algún tipo de objeto que exhiba la misma interfaz pública que la clase UserPreferences (idealmente un objeto que sea una instancia de UserPreferences) y que sea lo suficientemente inteligente como para poder ir y buscar el objeto UserPreferences real desde cualquier mecanismo de alcance subyacente que hayamos elegido (solicitud HTTP, sesión, etc.). A continuación, podemos insertar de forma segura este objeto proxy en el bean ''userManager'', que felizmente ignorará que la referencia de UserPreferences a la que se aferra es un proxy .
En nuestro caso, cuando una instancia de UserManager invoca un método en el objeto UserPreferences inyectado por dependencia, realmente invocará un método en el proxy ... el proxy se apagará y buscará el objeto UserPreferences real (en este caso) la sesión HTTP, y delegue la invocación del método en el objeto de preferencias de usuario real recuperado.
Es por eso que necesita la configuración siguiente, correcta y completa al inyectar beans con solicitud, sesión y vista global en objetos colaboradores:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
<aop:scoped-proxy/>
</bean>
<bean id="userManager" class="com.foo.UserManager">
<property name="userPreferences" ref="userPreferences"/>
</bean>
¿Alguien puede explicar el uso de la anotación spring @ScopedProxy
? Pensé que tenía algo que ver con los frijoles de sesión, pero no estoy muy seguro de qué.
En mi uso de ámbitos, he usado beans de ámbito de sesión sin la anotación @ScopedProxy
(o sin proxies con ámbito aop), así que estoy realmente seguro de cómo usarlo correctamente.