Подтвердить что ты не робот

Какова связь между java: comp/env и java: global?

Какова связь между java:comp/env и java:global (в отношении спецификации 3.1)?
Кажется, что java:comp/env содержит специальные ссылки EJB. Что означает "конкретный" в этом случае?

4b9b3361

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