JNDI的理解

JNDI(Java Naming And Directory Interface),這是一套查詢和訪問命名和目錄的接口規(guī)范.

  • 命名

我們假設(shè)有一個哈希表,命名就是它的key,key是一個字符串,而它的value是一個對象.我們可以用bind來綁定命名和對象,也可以用lookup來根據(jù)命名獲取對象.

  • 目錄

目錄我們可以理解成這張hash表的名字.我們可以通過Context.PROVIDER_URL來設(shè)置.

  • 規(guī)范的實(shí)現(xiàn)者

前面我們講到JNDI是一套規(guī)范,以下是它的實(shí)現(xiàn)者:
DNS、XNam 、Novell目錄服務(wù)、LDAP(Lightweight Directory Access Protocol 輕型目錄訪問協(xié)議)、 CORBA對象服務(wù)、文件系統(tǒng)、Windows XP/2000/NT/Me/9x的注冊表、RMI、DSML v1&v2、NIS

  • 實(shí)現(xiàn)者的區(qū)別

我們可以用參數(shù)Context.INITIAL_CONTEXT_FACTORY來指定是用哪個實(shí)現(xiàn)者.我們可能有個疑問,都是用來操作哈希表,為什么還要分不同的實(shí)現(xiàn)者呢?

  1. 不同的實(shí)現(xiàn)者自身已經(jīng)綁定了一些可用的命名和對象,我們可以直接拿來用
  2. 不同實(shí)現(xiàn)者綁定命名和對象的方式可能會有些許不同
<?xml version="1.0" encoding="UTF-8"?>  
<datasources>  
<local-tx-datasource>  
    <jndi-name>MySqlDS</jndi-name>  
    <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>  
    <driver-class>com.mysql.jdbc.Driver</driver-class>  
    <user-name>root</user-name>  
    <password>rootpassword</password>  
<exception-sorter-class-name>  
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter  
</exception-sorter-class-name>  
    <metadata>  
       <type-mapping>mySQL</type-mapping>  
    </metadata>  
</local-tx-datasource>  
</datasources> 

比如這種xml配置文件也是一種綁定命名和對象的方式,我們可以用DataSource ds=(Datasource)ctx.lookup("java:MySqlDS");來獲取一個數(shù)據(jù)源對象.這個例子也從側(cè)面說明JNDI的一個好處,以前我們配置數(shù)據(jù)庫相關(guān)參數(shù)都是在代碼里面寫死的,現(xiàn)在我們可以把它配置在XML文件里面,然后用JNDI引用.這樣子方便上線后仍能修改配置文件,而且使代碼更加簡潔.

  • RMI實(shí)現(xiàn)者的簡單例子

綁定代碼:

//注冊rmi端口
LocateRegistry.createRegistry(1099);
//配置實(shí)現(xiàn)者參數(shù)
Hashtable env = new Hashtable();
//配置實(shí)現(xiàn)者的類型
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
//配置目錄
env.put(Context.PROVIDER_URL, "rmi://localhost:1099");
//創(chuàng)建容器
InitialContext ctx = new InitialContext(env);
//綁定命名和對象
ctx.bind("HelloService",  new HelloServiceImpl());

獲取代碼:

//配置實(shí)現(xiàn)者參數(shù)
Hashtable env = new Hashtable();
//配置實(shí)現(xiàn)者的類型
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
//配置目錄
env.put(Context.PROVIDER_URL, "rmi://localhost:1099");
//創(chuàng)建容器
Context ctx = new InitialContext(env);
//根據(jù)命名獲取對象
HelloService helloService = (HelloService) ctx.lookup("HelloService");
//做事
helloService.say("haha");

以上即本人對JNDI的理解,如果錯誤,麻煩指正.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,745評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評論 19 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,017評論 0 11
  • 01 每年春節(jié)我們村都會有不少喜事,張家嫁女,李家娶媳,王家慶壽,陳家喬遷。鄉(xiāng)親們都趁著春節(jié),外出的人都已歸家,為...
    三湘漣漪閱讀 1,758評論 123 105
  • 今天聽了節(jié)微課,如何讓自己擁有好聲音。 首先我們要確定:1.聲音可以改變2.學(xué)習(xí)聲音的過程可以讓人快樂3.說話動聽...
    弈臻閱讀 178評論 0 0

友情鏈接更多精彩內(nèi)容