Какова связь между java:comp/env
и java:global
(в отношении спецификации 3.1)?
Кажется, что java:comp/env
содержит специальные ссылки EJB.
Что означает "конкретный" в этом случае?
Какова связь между java: comp/env и java: global?
Ответ 1
java:global
- это пространство имен, глобальное для всего сервера приложений, которое включает в себя другие модули EAR (которые считаются различными приложениями).
java:comp/env
- гораздо меньшее пространство имен. Для веб-модуля он соответствует всем веб-компонентам (сервлетам и т.д.), Которые все вместе считаются одним "компонентом" для JNDI, но для EJB beans это пространство имен для одного bean, так как каждый bean рассматривается как отдельный компонент.
Также существуют java:app
и a java:module
, чьи области охвата находятся между глобальными и comp.
Большая разница между java:comp/env
и другими заключается в том, что первая строго читается только во время выполнения и содержит среди других beans, которые вводятся в какой-либо компонент. Так, например, рассмотреть следующие вопросы:
@Stateless
public class ExampleBean {
@EJB
OtherBean testBean;
}
В этом случае конкретный прокси, который был введен в поле testBean
, также может быть получен из java:comp/env
, но только когда java:comp/env
ссылается из ExampleBean (JNDI является очень контекстуальным).
Если вам нужен другой прокси-сервер для EJB OtherBean
или вам нужна ссылка, если никакая инъекция не была выполнена, вы можете получить их из любой другой области. В зависимости от того, из какого класса вы выполняете вызов JNDI, вы сможете использовать более мелкие области.
Например, если OtherBean
определяется в том же модуле, что и ExampleBean
, вы можете использовать java:module
, если это одно и то же приложение (но, возможно, разные модули), вы можете использовать java:app
.
Наконец, java:global
всегда безопасен в использовании, так как он не зависит от контекста. Это означает, что вы можете использовать изнутри, например, неподдерживаемый полностью отдельный поток. Недостатком использования java:global
является то, что вы должны указать имя приложения и имя модуля, если используется EAR, и в противном случае, по крайней мере, имя модуля.