2011-03-11 21 views
11

Leo los documentos de primavera sobre este tema varias veces, pero algunas cosas aún no están claras para mí. estados Documentación:¿Frijoles de ámbito de sesión de primavera como dependencias en prototipos de frijoles?

Si desea inyectar (por ejemplo) una solicitud HTTP con ámbito de frijol en otro frijol, se tiene que inyectar un proxy AOP en lugar del frijol con ámbito. Es decir, debe inyectar un objeto proxy que exhiba la misma interfaz pública que el objeto con ámbito pero que también pueda recuperar el objeto objetivo real del ámbito relevante (por ejemplo, una solicitud HTTP) y delegar llamadas de método al objeto real .

Config ejemplo es el siguiente:

<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> 

Aquí, UserManager bean está en el ámbito como singleton. Entonces, me pregunto si este proxy aplica solo a beans de ámbito singleton, es decir, si desea inyectar beans de ámbito web en beans singleton, o también se aplica a los beans prototipo? Por ejemplo, si userManager se definió como prototipo?

Pregunto esto porque vi un código que inyecta beans de ámbito de sesión en prototipos sin aop-proxy, pero no estoy seguro de si esto es correcto ... En particular, esos eran beans DAO en algún sitio web -app, con el ámbito sesión, y se inyectaron en controladores de ámbito de prototipo para entornos de varios usuarios. ¿Es este el camino correcto? ¿Cómo deberían ser en general los beans DAO/Service en el entorno de la aplicación web?

Cualquier idea sería apreciada.

Respuesta

22

Siempre puede inyectar un bean de mayor alcance (por ejemplo, un singleton) en un bean de ámbito más estrecho (por ejemplo, un bean con ámbito de sesión), pero a la inversa, necesita un proxy de ámbito.

Por lo tanto, su ejemplo de inyectar un bean de ámbito de sesión en un bean de ámbito de prototipo está bien, porque el ámbito de sesión es "más amplio" que el ámbito de prototipo.

Si te equivocas, entonces Spring te lo dirá. Si no se queja, entonces no lo necesita.

Cuestiones relacionadas