2011-09-17 43 views

回答

40

java:global是整個應用程序服務器的全局命名空間,其中包括其他EAR模塊(被認爲是不同的應用程序)。

java:comp/env是一個較小的命名空間。對於Web模塊,它對應於所有的Web組件(Servlet等),這些組件都被認爲是JNDI的單個「組件」,但對於EJB Bean,它是單個Bean的名稱空間,因爲每個bean都被認爲是單獨的組件。

還有一個java:app和一個java:module,其範圍介於全球和比較。

java:comp/env和其他的區別很大,前者在運行時是嚴格只讀的,並且包含注入某個組件的bean。所以例如考慮:

@Stateless 
public class ExampleBean { 

    @EJB 
    OtherBean testBean; 

} 

在這種情況下,也可以從java:comp/env獲得該注入字段testBean的特定代理,但只有當java:comp/env從內叫exampleBean引用(JNDI是高度上下文)。

如果您希望獲得與EJB OtherBean不同的代理服務器,或者在沒有完成注入時想要引用,則可以從其他任何示波器中獲取這些代理。根據您正在從事的JNDI調用的哪個類,您可以使用較小的作用域。

例如,如果OtherBean是在同一模塊中定義爲ExampleBean,你可以使用java:module,如果是同一個應用程序(但可能不同的模塊),你可以使用java:app

最後,java:global總是安全使用,因爲它不依賴於上下文。這意味着您可以從例如一個非管理完全獨立的線程。使用java:global的缺點是,如果使用EAR,則必須包含應用程序名稱和模塊名稱,否則至少應包含模塊名稱。

相關問題