JavaEE規範學習(一)--- JNDI
概述
JNDI(JavaNaming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標準的Java命名系統接口,JNDI提供統一的客戶端API,通過不同的訪問提供者接口JNDI服務供應接口(SPI)的實現,由管理者將JNDI API映射爲特定的命名服務和目錄系統,使得Java應用程序可以和這些命名服務和目錄服務之間進行交互。目錄服務是命名服務的一種自然擴展。兩者之間的關鍵差別是目錄服務中對象不但可以有名稱還可以有屬性(例如,用戶有email地址),而命名服務中對象沒有屬性。
集羣JNDI實現了高可靠性JNDI,通過服務器的集羣,保證了JNDI的負載平衡和錯誤恢復。在全局共享的方式下,集羣中的一個應用服務器保證本地JNDI樹的獨立性,並擁有全局的JNDI樹。每個應用服務器在把部署的服務對象綁定到自己本地的JNDI樹的同時,還綁定到一個共享的全局JNDI樹,實現全局JNDI和自身JNDI的聯繫。
JNDI(JavaNaming and Directory Interface)是一個應用程序設計的API,爲開發人員提供了查找和訪問各種命名和目錄服務的通用、統一的接口,類似JDBC都是構建在抽象層上。現在JNDI已經成爲J2EE的標準之一,所有的J2EE容器都必須提供一個JNDI的服務。
JNDI可訪問的現有的目錄及服務有:
DNS、XNam 、Novell目錄服務、LDAP(Lightweight Directory Access Protocol輕型目錄訪問協議)、 CORBA對象服務、文件系統、Windows XP/2000/NT/Me/9x的註冊表、RMI、DSML v1&v2、NIS。
何時使用JNDI
JNDI是一種查找服務,用於查找:
Web應用環境變量
EJBs和他們的環境變量
通過DataSources的數據庫連接池
JMS目標和連接工廠
備註:不要講JNDI當做數據庫使用,因爲JDNI對象存儲在內存中,訪問JDNI對象與網絡性能有關(網絡好的時候查找性能高)。
JNDI必備知識
JNDI樹
JNDI環境屬性
在EJB中使用properties文件使用JNDI
jndi.properties文件內容
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
備註:jndi.properties文件爲所有的InitialContexts設置默認的屬性,jndi.properties文件的搜索次序
·CLASSPATH
·$JAVA_HOME/lib
從JNDI查找
·Lookup()從JNDI樹獲取對象
//實例化一個InitialContext對象
InitialContext ctx = new InitialContext();
//在JNDI樹上查找“UserManagerBean對象
UserManager userManager =(UserManager)ctx.lookup("UserManagerBean/remote");
User user = new User();
user.setUserName("cody");
user.setPossword("0909");
//使用查找到對象的方法
userManager.addUser(user);
//連接完成之後關閉訪問資源
ctx.close();
談談遠程綁定對象
·綁定到遠程命名服務的對象必須是序列化的
·訪問命名服務時,對象是採用複製機制
EJB是如何綁定遠程訪問對象的?
EJB通過@Remote註解將對象綁定到JNDI樹上
@Stateless
@Remote(UserManager.class)
public classUserManagerBean implements UserManager {
@Override
public void addUser(User user) {
System.out.println("User[userName="+user.getUserName()+"]已經被成功保存");
user.setId(10);
}
}
JNDI可能出現的異常
·AuthenticationException
沒有提供認證信息,或者提供的認證信息有誤
·CommunicationException
通信異常
·InvalidNameException
非法命名之類的異常
·NameNotFoundException
沒有找到相應名稱的資源
·NoInitialContextException
沒有初始化InitialContext對象
總結
J2EE規範要求所有 J2EE 容器都要提供 JNDI 規範的實現。JNDI 在 J2EE 中的角色就是“交換機” —— J2EE 組件在運行時間接地查找其他組件、資源或服務的通用機制。在多數情況下,提供 JNDI 供應者的容器可以充當有限的數據存儲,這樣管理員就可以設置應用程序的執行屬性,並讓其他應用程序引用這些屬性(Java 管理擴展(Java ManagementExtensions,JMX)也可以用作這個目的)。JNDI 在 J2EE 應用程序中的主要角色就是提供間接層,這樣組件就可以發現所需要的資源,而不用瞭解這些間接性。
在 J2EE 中,JNDI 是把 J2EE 應用程序合在一起的粘合劑,JNDI 提供的間接尋址允許跨企業交付可伸縮的、功能強大且很靈活的應用程序。這是 J2EE 的承諾,而且經過一些計劃和預先考慮,這個承諾是完全可以實現的。