Spring @Autowired путаница (контейнер или сеанс) - PullRequest
9 голосов
/ 15 января 2012

В моем приложении я использую bean-компонент User, который автоматически подключен к моему сервису MyService, и он используется в качестве принципа, вошедшего в информацию пользователя (поэтому пользователь не приходит как статический бин из xml, а генерируется динамическиот зарегистрированного пользователя) Если в систему вошли десять пользователей, у меня будет десять кандидатов на поле @AutoWired User.(верно?), и я могу получить любой из них, потому что AutoWired выглядит в контейнере Spring, а не в сеансе.

, скажите мне, если я ошибаюсь в этом.и как на самом деле решить это, если это возможно.Но что, если мое поле AutoWired помечено @Scope ("Session")

Примерно так:

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

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

}

Возможно ли получить бин User другого пользователя при вызове моегоMyService Компонент.Cos MyService - это всего лишь @Component, хотя User равно @Scope(session).

В основном, (если я ошибаюсь в своем предположении), я думаю, что когда вы @Autowire поле, его внешний видв контейнер в целом, и контейнер не разделен на подконтейнеры для сеанса.

Ответы [ 2 ]

13 голосов
/ 27 октября 2013

Spring не будет автоматически создавать прокси.Вам необходимо изменить аннотацию области на следующую

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

. Это обеспечит автоматическое подключение сессионного компонента в одноэлементном классе, и вокруг компонента будет создан прокси, который будет отвечать за получение компонентас сессии.

13 голосов
/ 15 января 2012

Когда вы аннотируете User с помощью @Scope("session"), а затем @Autowire это в другой компонент без области действия, Spring сгенерирует прокси, который находится между MyService и User.Этот прокси найдет User из текущего сеанса и делегирует любые вызовы от MyService прокси в сессионную область User.

Так что совершенно безопасно, компонент MyService будет иметь доступ только к User из текущего сеанса.

Если проксирование не произойдет, тогда контейнер не сможетначать, так как вы не можете напрямую внедрить сессионный компонент в синглтонный компонент.

...