java:global
- это пространство имен, которое является глобальным для всего сервера приложений, включая другие модули EAR (которые считаются различными приложениями).
java:comp/env
- это намного пространство имен меньшего размера. Для веб-модуля он соответствует всем веб-компонентам (сервлетам и т. Д.), Которые все вместе рассматриваются как один «компонент» для JNDI, но для EJB-бинов это пространство имен для одного бина, поскольку каждый бин считается отдельный компонент.
Также есть java:app
и java:module
, области видимости которых находятся между глобальным и комп.
Большая разница между java:comp/env
и остальными заключается в том, что первый является строго доступным только для чтения во время выполнения и содержит, среди прочего, компоненты, которые вводятся в некоторый компонент. Так, например рассмотреть следующие вопросы:
@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, и в противном случае, по крайней мере, имя модуля.