Экземпляр компонента с более короткой областью действия, внедренный в экземпляр компонента с большей областью действия в CDI — как это работает?

Рассмотрим следующий bean-компонент CDI с областью действия запроса:

@RequestScoped
public class RequestScopedBean {
    // ...
}

Теперь я ввожу его в bean-компонент с областью действия приложения:

@ApplicationScoped
public class ApplicationScopedBean {
    @Inject private RequestScopedBean requestScopedBean;
    // ...
}

Я запустил этот код и заметил, что экземпляр bean-компонента в области запроса различается между двумя запросами, но экземпляр bean-компонента в области приложения один и тот же. У меня сомнения: как это работает? Переопределяется ли экземпляр bean-компонента с областью действия запроса в поле области приложения при каждом запросе? Или прокси bean-компонента области приложения просто меняется между запросами?


person brandizzi    schedule 05.07.2011    source источник
comment
@jangroth 4.9 Клиентские прокси глава дает обзор, но не объясняет, как это работает на самом деле. В частности, что происходит, когда в один компонент @ApplicationScoped внедряется компонент @SessionScoped, и он получает два параллельных вызова из методов @RequestScoped?   -  person Alex    schedule 25.02.2015
comment
Вы заметили, что вопрос был задан 4 года назад, и что за это время у CDI/Weld (и его документации) было несколько изменений версий? ;)   -  person jan groth    schedule 25.02.2015


Ответы (1)


В CDI каждый введенный объект фактически является прокси. Таким образом, в этом случае прокси, вероятно, содержит ссылку на RequestContext и при каждом вызове метода получает правильный экземпляр компонента.

person Bozho    schedule 05.07.2011
comment
Верно в основе, но не в деталях. DependentScoped bean-компоненты никогда не будут проксироваться, как и SingletonScoped bean-компоненты. Обе области видимости являются так называемыми псевдообластями. - person jan groth; 05.07.2011
comment
Является ли область применения псевдообластью? Я не уверен в этом. Во всяком случае, я имел в виду конкретный пример - контекст запроса. - person Bozho; 05.07.2011
comment
Нет, не ApplicationScope, а SingletonScope есть. Вот почему всегда лучше использовать ApplicationScope :-) - person jan groth; 05.07.2011
comment
Просто чтобы прояснить это для других, в CDI нет такой вещи, как SingletonScoped, есть нелюбимый ступенчатый ребенок @javax.inject.Singleton, который унаследован от JSR-330 Dependency Injection для Java. Этого следует избегать любой ценой, ваша потребность, скорее всего, будет удовлетворена ApplicationScoped в любом случае. - person dngfng; 05.02.2016