命名服務(wù)(naming service)
命名服務(wù)是計(jì)算機(jī)系統(tǒng)中的一個基本功能。命名服務(wù)是將名字和計(jì)算機(jī)中的一個對象相關(guān)聯(lián),通過名字可以方便地找到對應(yīng)的對象。例如,計(jì)算機(jī)中的文件系統(tǒng)就包含了一個命名服務(wù),你可以通過文件名找到對應(yīng)的文件對象。
目錄服務(wù)(directory service)
目錄服務(wù)是命名服務(wù)的延伸,目錄服務(wù)不只保存對象和對象名的匹配,而且保存這個對象的各種屬性,你可以對這些屬性進(jìn)行查詢、修改、增加、刪除操作。
JNDI(Java Naming Directory Interface)
JNDI是一些標(biāo)準(zhǔn)API接口,Java程序通過這些API可以訪問命名目錄服務(wù)。JNDI的定義不依賴于任何獨(dú)立的命名目錄服務(wù)器,對于各種命名目錄服務(wù)器,都可通過統(tǒng)一的JNDI接口調(diào)用。
JNDI結(jié)構(gòu)包括兩組API:JNDI API(Application Programming Interface)和JNDI SPI(Service Provider Interface)。Java應(yīng)用程序通過JNDI API訪問各種命名目錄服務(wù)。JNDI SPI使得各種命名目錄服務(wù)透明地加入到JNDI結(jié)構(gòu)中,如上圖中的LDAP、DNS、NIS等服務(wù)通過JNDI SPI加入到JNDI結(jié)構(gòu)中,從而使Java應(yīng)用程序能夠通過JNDI API訪問這些服務(wù)。
JNDI Context
Context是一系列命名到對象綁定的集合,Context提供以下主要接口訪問命名服務(wù),JNDI中的一組綁定作為上下文來引用。每個上下文暴露的一組操作是一致的。例如,每個上下文提供了一個查找操作,返回指定名字的相應(yīng)對象。每個上下文都提供了綁定和撤除綁定名字到某個對象的操作。JNDI使用通用的方式來暴露命名空間,即使用分層上下文以及使用相同命名語法的子上下文。
bind(Name name, Object obj) 建立一個命名到一個對象的匹配關(guān)系,也叫綁定
lookup(String name) 通過命名查找其對應(yīng)的對象
rebind(Name name, Object obj) 重新綁定一個命名到對象,覆蓋原來的綁定
unbind(Name name) 解除這個命名到其匹配對象的綁定關(guān)系
在客戶端使用JNDI:
u 創(chuàng)建一個java.util.Hashtable或者java.util.Properties的實(shí)例。
u 添加變量到Hashtable或Properties對象:
由naming server提供的JNDI class類名。
包含aming server位置的URL。
安全信任書。
u 通過Hashtable或Properites或jndi屬性文件創(chuàng)建一個InitialContext對象。
示例:












環(huán)境變量 |
相應(yīng)的常量 |
說明 |
java.naming.factory.initial |
Context.INITIAL_CONTEXT_FACTORY |
Context Factory 類名,由服務(wù)提供商給出。 |
java.naming.provider.url |
Context.PROVIDE_URL |
初始化地址。 |
java.naming.security. principal |
Context.SECURITY_PRINCIPAL |
服務(wù)使用者信息。 |
java.naming.security. credentials |
Context.SECURITY_CREDENTIAL |
口令。 |
更多的配置示例:


























創(chuàng)建InitialContext:
Class Name: javax.naming.InitialContext
Interfaces that it implements: javax.naming.Context
Constructors:
public InitialContext(Hashtable configuration);
public InitialContext(Properties configuration);
一個Binding示例:





























一個Lookup示例:




























枚舉所有名字對象:
NamingEnumeration Declaration:


















最后的示例:














































