Когда именно аннотация @Inject инициирует внедрение компонента SessionScoped в сервлет? - PullRequest
6 голосов
/ 28 декабря 2011

Мне нужно изменить объект сеанса пользователя (компонент SessionScoped - CDI) в сервлете, поэтому мне нужно каким-то образом получить этот компонент. Я использовал инъекцию следующим образом:

@Inject
private UserSession user;

где UserSession является компонентом SessionScoped CDI. user методы вызываются из методов сервлета doPost или doGet. Это работает отлично; каждый раз, когда аннотация @Inject внедряет соответствующий компонент UserSession, но я не понимаю, как достигается такое поведение.

Я предположил, что компоненты, помеченные @Inject, вводятся только один раз (когда создается объект - в данном случае экземпляр сервлета), но это, очевидно, неверное предположение.

Итак, когда эти бобы вводятся в сервлет? По запросу? И как этот подход позволяет избежать конфликтов (один экземпляр сервлета - несколько потоков для его решения), когда существует несколько объектов UserSession?

Ответы [ 2 ]

6 голосов
/ 28 декабря 2011

CDI использует шаблон прокси .Внедренный экземпляр - это на самом деле не реальный экземпляр, а прокси, который находит реальный экземпляр в зависимости от текущего контекста и делегирует ему все методы (например, как работают EJB).Автоматически сгенерированный класс вашего компонента UserSession выглядит примерно так:

public UserSessionCDIProxy extends UserSession implements Serializable {

    public String getSomeProperty() {
        UserSession instance = CDI.resolveItSomehow();
        return instance.getSomeProperty();
    }

    public void setSomeProperty(String someProperty) {
        UserSession instance = CDI.resolveItSomehow();
        instance.setSomeProperty(someProperty);
    }

}

Этот механизм позволяет вводить экземпляры более узкой области действия в экземплярах более широкой области действия и позволяет по-прежнему получать ожидаемый экземпляр втекущий контекст.Стандартная аннотация JSF @ManagedProperty не поддерживает ее просто потому, что она не использует прокси-сервер, а внедряет нужный экземпляр напрямую.Вот почему невозможно ввести что-то более узкое с помощью @ManagedProperty.

См. Также:

4 голосов
/ 28 декабря 2011

Ваш ответ лежит в C CDI, что означает контексты.

В результате получается, что вводится не фактический компонент, а прокси.Этот прокси является контекстным и преобразуется в фактический bean-объект области действия сеанса в зависимости от контекста вызывающей стороны, от имени которой выполняется прокси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...