Какова связь между 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, и в противном случае, по крайней мере, имя модуля.