Какая связь между java: comp / env и java: global? - PullRequest
22 голосов
/ 18 сентября 2011

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

1 Ответ

41 голосов
/ 18 сентября 2011

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

...