標籤:
一、JNDI概述
JNDI(JavaNaming Directory Interface)--java命名和目錄介面,是一組在Java應用中訪問命名和目錄服務的API。為開發人員提供了尋找和訪問各種命名和目錄服務的通用、統一的介面,類似JDBC,都是構建在抽象層上。是J2EE的標準之一,所有的J2EE容器都必須提供一個JNDI的服務。
JNDI的命稱可能會讓人產生混淆,一開始接觸到這一規範覺得這是一個用來操作目錄的,事實上,可以把這個目錄理解成為JNDI存放對象時使用的格式,也就是說,JNDI以目錄的方式儲存物件的屬性。
二、命名服務和目錄服務
命名或目錄服務使使用者可以集中儲存共有資訊,這使得這樣的應用更協調、更容易管理。例如,可以將印表機設定儲存在目錄服務中,以便被與印表機有關的應用使用。
我們大家每天都不知不覺地使用了命名服務。命名系統中的對象可以是DNS記錄中的名稱、應用伺服器中的EJB組件(Enterprise JavaBeans Component)、LDAP(LightweightDirectory Access Protocol)中的使用者Profile。
目錄服務是命名服務的自然擴充。兩者之間的關鍵差別是目錄服務中對象可以有屬性(例如,使用者有email地址),而命名服務中對象沒有屬性。因此,在目錄服務中,你可以根據屬性搜尋對象。
三、常用基本操作
1、綁定與釋放
1)void bind(String sName,Object object)綁定:把名稱同對象關聯的過程
2)void rebind(String sName,Object object) 重新綁定:用來把對象同一個已經存在的名稱重新綁定。一般使用rebind()而不使用bind(),因為當有重名的時候rebind()不會出現異常,而bind()會報異常。
3)voidunbind(String sName) 釋放:用來把對象從目錄中釋放出來。
應用代碼如下:
public staticContext getInitialContext() throws NamingException{ Environment env = new Environment(); env.setProviderUrl("xxx"); env.setSecurityPrincipa("system"); env.setSecurityCredendtials("weblogic"); Contextcontext = env.getInitialContext(); returncontext;} //獲得intial context Context ctx =getInitialContext(); //建立名為Band的對象 Bank myBank = newBank(); //對象綁定 ctx.bind("theBank",myBank); //把對象重新綁定到JNDI樹 ctx.rebind("theBank",myBank); //解除綁定 ctx.unbind("theBank"); ctx.close();
2、尋找對象
Void lookup(string sName,Object object) 尋找:返回目錄總的一個對象
importjavax.naming.*;try{ Context ic = new Context(); Objectobj; obj= ic.lookup("javax.transaction.UserTransaction"); UserTransactionut = (UserTransaction)obj; ut.begin(); ic.close();}catch(NamingExceptione){}
3、重新命名對象
void rename(String sOldName,StringsNewName) 重新命名:用來修改對象名稱綁定的名稱。
ctx.rename("report.txt", "old_report.txt");
4、擷取清單
NamingEnumerationlistBindings(StringsName) 清單:返回綁定在特定上下文中指定屬性名稱對象的清單列表,它返回名字、類和對象本身,它用於那些需要對對象進行實際操作的應用。
//得到初始目錄環境的一個引用Context cntxt = new InitialContext();//返回綁定在特定上下文中指定屬性名稱對象的清單列表NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");//迴圈列出所有名字、類和對象while ( namEnumList.hasMore() ) { Binding bnd = (Binding) namEnumList.next(); String sObjName = bnd.getName(); String sClassName = bnd.getClassName(); //得到對象 SomeObject objLocal = (SomeObject) bnd.getObject();}
四、總結
JNDI的思想是提供一個通用的介面。底層的名字服務時限可以是各種類型,JNDI通過SPI時限代碼屏蔽了各種名字和目錄服務實現的區別。
JNDI可以解決資料共用,分布式應用,緊耦合的問題,所以可以應用在一些比較大的軟體開發中,分布式系統中或者是比較重視後期維護和升級的項目中。
【J2EE淺析】——JNDI