2016-04-13 5 views
0

У меня есть простой POJO UserQuota с 1 поле quota в нем:почему мой весенний сеанс включен в список сеансов?

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public interface UserQuota { 
    public int getQuota(); 
    public void setQuota(int quota); 
} 

сейчас, я использовал два разных окна браузера (Firefox и хром), чтобы войти в мой веб-приложение в виде двух разных пользователей. к моему удивлению, когда я устанавливаю значение квоты (с setQuota) с одного сеанса, новое значение становится доступным для другого сеанса (когда вызывается getQuota). Я ожидал, что каждый пользовательский сеанс будет иметь свой собственный экземпляр компонента; Разве это не то, что для весенней фасоли для сеанса?

У меня должно быть что-то отсутствует. что это может быть?

редактировать:

класс реализации выглядит следующим образом:

@Component 
public class UserQuotaImpl implements UserQuota { 

    private int quota; 

    /** 
    * @return the quota 
    */ 
    public int getQuota() { 
     return quota; 
    } 

    /** 
    * @param quota the quota to set 
    */ 
    public void setQuota(int quota) { 
     this.quota = quota; 
    } 

} 

и, наконец, вот как я использовать сессионный компонент:

@Component 
public class UserQuotaHandler { 

    @Autowired 
    private UserQuota userQuota; 

    public void checkAndUpdateQuota() { 
     int quota = userQuota.getQuota(); 

     // i use my business logic to decide whether the quota needs an update 
     if(myBusinessLogic) { 
      userQuota.setQuota(someNewValue); 
     } 
    } 

} 

я использую context:component-scan в моей XML-конфигурации файл. можно отметить, что большинство моих других фасоли, которые были автомоделированы, представляют собой одноэлементные бобы, которые, похоже, работают как ожидалось

+0

Пожалуйста, покажите, как вы вводите и используете боб. – Savior

+0

Я обновил свой вопрос по запросу – Tanvir

+0

Где класс реализации? Вам нужно будет аннотировать это с помощью '@ Scope', а не интерфейса, afaik. – Savior

ответ

2

Вы хотите, чтобы аннотировать свой конкретный компонент bean-класса с помощью сеанса @Scope, UserQuotaImpl в вашем случае.

Весна игнорирует @Scope на любых суперклассах или суперинтерфейсах вашего конкретного класса. А так как ваш тип не имеет каких-либо явных @Scope аннотаций

@Component 
public class UserQuotaImpl implements UserQuota { 

Spring предполагает, вы имели в виду, чтобы сделать его одноэлементно боб.

+0

, что означает, что мои объекты с областями с областью запросов тоже имеют такую ​​же проблему! дело только в том, что проблема с сессионным компонентом сначала вышла на поверхность – Tanvir

+1

@Tanvir В общем, не предполагайте, что аннотации когда-либо «унаследованы». – Savior