Как область сеанса bean-компонента работает в приложении Spring MVC?

Я новичок в Spring MVC, и у меня есть сомнения по поводу области сеанса компонента.

В проекте у меня есть bean-компонент Cart, вот этот:

@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Cart {


    private Map<Product, Integer> contents = new HashMap<>();

    public Map<Product, Integer> getContents() {
        return contents;
    }

    public Set<Product> getProducts() {
        return contents.keySet();
    }

    public void addProduct(Product product, int count) {

        if (contents.containsKey(product)) {
            contents.put(product, contents.get(product) + count);
        } 
        else {
            contents.put(product, count);
        }
    }


    public void removeProduct(Product product) {
        contents.remove(product);
    }

    public void clearCart() {
        contents.clear();
    }

    @Override
    public String toString() {
        return contents.toString();
    }

    public double getTotalCost() {
        double totalCost = 0;
        for (Product product : contents.keySet()) {
            totalCost += product.getPrice();
        }
        return totalCost;
    }

}

Таким образом, этот компонент автоматически определяется контейнером как компонент и устанавливается как сессионный компонент:

@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)

Итак, насколько я понимаю, это означает, что автоматически создается один компонент для каждого сеанса пользователя.

В моем примере класс Cart представляет собой корзину для покупок, в которую зарегистрированный пользователь помещает товары, которые хочет купить. Означает ли это, что существует один bean-компонент Cart для каждого зарегистрированного пользовательского раздела в HttpSession? Таким образом, этот компонент находится в сеансе, и пользователь может добавлять или удалять элементы из него. Верна ли эта интерпретация или я что-то упускаю?

Еще одно сомнение связано с атрибутом proxyMode = ScopedProxyMode.TARGET_CLASS. Что именно это означает? Почему он применяется к этому бобу?


person Community    schedule 13.09.2015    source источник
comment
stackoverflow.com/questions/14371335/spring-scoped-proxy-bean См. принятый ответ, лучшее объяснение на данный момент.   -  person Saurabh    schedule 13.09.2015


Ответы (1)


Итак, насколько я понимаю, это означает, что автоматически создается один компонент для каждого сеанса пользователя.

Сеансовый компонент будет создан для каждого пользователя, но только по запросу. Другими словами, если для данного запроса вам на самом деле не нужен этот компонент, контейнер не создаст его для вас. Это, в некотором смысле, «лень».

Типичное использование

@Controller
public class MyController {
    @Autowired
    private MySessionScopeBean myBean;
    // use it in handlers
}

Здесь вы вводите bean-компонент с областью действия сеанса в bean-компонент области singleton. Что сделает Spring, так это внедрит bean-компонент proxy, который внутри сможет генерировать реальный объект MySessionScopeBean для каждого пользователя и сохранять его в файле HttpSession.

Атрибут и значение аннотации

proxyMode = ScopedProxyMode.TARGET_CLASS

определяет, как Spring будет проксировать ваш компонент. В этом случае он будет проксировать, сохраняя целевой класс. Для этой цели он будет использовать CGLIB. Альтернативой является INTERFACES, где Spring использует прокси-серверы JDK. Они не сохраняют тип класса целевого компонента, а только его интерфейсы.

Подробнее о прокси можно прочитать здесь:

Вот связанный пост о области запроса:

person Sotirios Delimanolis    schedule 13.09.2015