2012-01-15 11 views
7

En Mi aplicación estoy usando un bean User que está Autocadenado a mi servicio MyService y se utiliza como el inicio de sesión principal de la información del usuario (Por lo tanto, el usuario no viene como un bean estático de un xml generado dinámicamente desde un usuario conectado) Si hay diez usuarios conectados, tendré diez candidatos para el campo @AutoWiredUser. (¿verdad?) y puedo obtener cualquiera de ellos porque se ve automáticamente en el contenedor Spring y no en la sesión.Primavera @ Confusión autoajustada (contenedor o sesión)

dime si me equivoco en esto. y cómo resolverlo realmente si es posible. Pero ¿y si mi campo AutoWired se anota con @Scope ("Session")

De esta manera:

@Component("user") 
@Scope("session") 
public class User 
{ 
String userid; 
String name; 
//getter setters etc 
} 

@Component 
public class MyService 
{ 
    @Autowired 
    private User user; 

} 

¿Es posible obtener grano de usuario de algún otro usuario cuando llamo mi MyService componentes. Cos MyService es solo @Component aunque el User es @Scope(session).

Básicamente, (si me equivoco en mi suposición) creo que cuando @Autowire un campo, se ve en el contenedor como un todo y el contenedor no se divide en subcontenedores por sesión.

Respuesta

11

Al anotar User con @Scope("session") y luego @Autowire que en otro componente no restringidos, la primavera va a generar un proxy que se encuentra entre MyService y User. Este proxy localizará el User de la sesión actual y delegará cualquier llamada de MyService al proxy en el ámbito de sesión User.

Por lo tanto, es perfectamente seguro, el componente MyService solo tendrá acceso al User de la sesión actual.

Si el proxying no sucedió, entonces el contenedor no podría iniciarse, ya que no se puede inyectar directamente un bean con ámbito de sesión en beans de ámbito singleton.

+0

Así que no es posible que cuando hago un 'SpringUtils.getContext (req) .getBean (" miservicio ")', obtengo otro bean de usuario que no está en la sesión actual. – sarmahdi

+1

@sarmahdi: Eso es correcto. La sesión actual del usuario es una variable local de hilo mantenida por Spring. – skaffman

+0

Así que no es posible que cuando hago un 'SpringUtils.getContext (req) .getBean (" miservicio ")', obtengo otro bean de usuario que no está en la sesión actual. En realidad recibí este problema que cargué una página y obtuve algunos detalles de otros usuarios. Así que estaba pensando que podría ser cos incluso si el usuario tiene sesiones con alcance, el servicio no es y sin ámbito son por defecto singelton. – sarmahdi

11

El resorte no creará automáticamente un proxy. Usted necesita cambiar su anotación alcance a la siguiente

@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) 

Esto garantizaría que cuando el bean de sesión se está autowired en una clase Singleton, un proxy se crea alrededor del frijol que sería responsable de obtener el grano de la sesión.

Cuestiones relacionadas