Разница между контекстом и областью действия в CDI - и Java вообще - PullRequest
12 голосов
/ 03 июля 2011

Изучая JSR-299, я прочитал раздел 5.1 справки Weld , в которой объясняется, как работают области в CDI.По-видимому, контекст - это понятие, тесно связанное с объемом.Я немного понял, что такое каждый из них, но это не очень четко разделено в моем разуме, и я чувствую соблазн даже использовать слова взаимозаменяемо.

В чем разница между областью и контекстом?Какова взаимосвязь между этими двумя понятиями?

Я ожидаю ответа в области CDI, но у меня есть сомнения относительно Java в целом, так как понятия используются и в других контекстах.На самом деле, ответ, который объясняет понятия в контексте CDI, Java и в целом, получил бы больше очков - если бы я мог их дать.

Ответы [ 3 ]

7 голосов
/ 05 июля 2011

Каждая область имеет отдельный контекст.

Контекст - это контейнер для bean-компонентов, которые были определены с соответствующей областью действия.

Вот почему реализации контекста носят название области действия - ApplicationContext, DependentContext, RequestContext и т. Д.

На самом деле это деталь реализации - как пользователь CDI, вы должны знать только об областях (потому что вы определяете его для ваших bean-компонентов), и реализация решает, где разместить эти bean-компоненты и как управлять их жизненным циклом.

2 голосов
/ 04 июля 2011

Насколько я понимаю, область действия относится к тому, откуда можно получить доступ к объекту, а контекст перечисляет объекты, к которым можно получить доступ с некоторой конкретной точки выполнения программы. (То есть мы говорим о сфере действия объекта и контексте в какой-то конкретный момент выполнения программы.)

Говоря математически, оба описывают отношение доступа к каналу, но смотрят на него в разных направлениях.

1 голос
/ 05 июля 2011

Во-первых, у нас в голове есть такие понятия, как приложения, сессии, запросы. Давайте использовать концепцию сеанса в следующих примерах.

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

Сессия имеет несколько переменных, например, userName; мы будем говорить, что сессия является областью действия этих переменных.

Поскольку оба указывают на один и тот же сеанс, это может привести к путанице. Например,

get the userName from the session context
get the userName from the session scope

оба звучат нормально, потому что речь идет об исполнении переменной.

Следующий пример понятен согласно определению объема

the scope of the injected bean is Session

но у нас нет проблем с пониманием того, что на самом деле происходит. Если мы хотим, мы можем расширить его, пока он не будет основан на базовом использовании слов; мы этого не делаем, потому что это будет очень многословно.

Перед автором стоит сложная задача сложить слова лаконично, но при этом ожидать, что читатели каким-то образом поймут сложное значение. Тексты о контексте и сфере видимости обычно кажутся бессмысленными для тех, кто не понимает концепции.

Имена API еще сложнее придумать, потому что коды не являются английскими предложениями. Context или Scope в значительной степени взаимозаменяемы. Если есть только один объект, представляющий сеанс, класс, вероятно, должен быть назван просто Session. Если мы разделим часть о работе с переменными, эту часть можно назвать SessionScope. Тем не менее, значение SessionContext слишком неуловимо, самое лучшее, что мы можем сказать, исходя только из названия, это то, что речь идет о чем-то вроде сеанса - «контекст» здесь в значительной степени объясняющий.

...