深刻理解JNDI

2023-11-11

JNDI是J2EE的核心技术之一,JNDI的功能简单说就是可以简单的方式去查找某种资源。比如在Tomcat中配置了一个JNDI数据源,那么在程序中之需要用Java标准的API就可以查找到这个数据源,以后数据源配置发生变化了,等等,程序都不需要改动,之需要改改JNDI的配置就行。增加了程序的灵活性,也给系统解耦了。
 
JNDI的非常重要,我们时不时都在用它,可是很多程序员对它都很陌生,包括本人在内,下面从最根本的概念入手,认识下JNDI,也为以后深入研究JNDI做个铺垫。
 
JNDI的概念不是一两句话能说清楚的,网上对JNDI的概念解释很多,基本上都是对官方文档的翻译的copy。在此也不废话了,摘抄SUN官方的一些权威解释出来,下面来自java.sun.com:
 
Java命名和目录接口(Java Naming and Directory Interface ,JNDI)是用于从Java应用程序中访问名称和目录服务的一组API。命名服务即将名称与对象相关联,以便能通过相应名称访问这些对象。而目录服务即其对象具有属性及名称的命名服务。

命名或目录服务允许您集中管理共享信息的存储,这在网络应用程序中很重要,因为它可以使这类应用程序更加一致和易于管理。例如,可以将打印机配置存储在目录服务中,这样所有与打印机相关的应用程序都能够使用它。
 
JNDI综述
我们所有人每天都在不自知的情况下使用命名服务。例如,当您在浏览器中输入URL http://java.sun.com 时,域名系统(Domain Name System ,DNS)将这个以符号表示的URL转换为一个通信标识符(IP地址)。在命名系统中,对象的范围可以从位于DNS记录中的名称变动到应用程序服务器中的企业JavaBeans组件(Enterprise JavaBeans Components ,EJBs),还可以到轻量级目录访问协议(Lightweight Directory Access Protocol ,LDAP)中的用户配置文件。

目录服务是命名服务的自然扩展。二者的关键区别在于,目录服务允许属性(比如用户的电子邮件地址)与对象相关联,而命名服务则不然。这样,使用目录服务时,您可以基于对象的属性来搜索它们。JNDI允许您访问文件系统中的文件,定位远程RMI注册表中的对象,访问诸如LDAP这样的目录服务,并定位网络上的EJB。

很多应用程序选择使用JNDI都可以收到良好的效果,比如LDAP客户端、应用程序启动器、类浏览器、网络管理实用工具,或者甚至是地址簿。
 
JNDI架构
JNDI架构提供了一个标准的、与命名系统无关的API,这个API构建在特定于命名系统的驱动程序之上。这一层帮助把应用程序和实际的数据源隔离开来,因此无论应用程序是访问LDAP、RMI、DNS还是其他的目录服务,这都没有关系。换句话说,JNDI与任何特定的目录服务实现无关,您可以使用任何目录,只要您拥有相应的服务提供程序接口(或驱动程序)即可,如图下图所示。

注意,关于JNDI有一点很重要,即它同时提供应用程序编程接口(Application Programming Interface ,API)和服务提供程序接口(Service Provider Interface ,SPI)。这样做的实际意义在于,对于您的与命名或目录服务交互的应用程序来说,必须存在用于该服务的一个JNDI服务提供程序,这便是JNDI SPI发挥作用的舞台。一个服务提供程序基本上就是一组类,这些类针对特定的命名和目录服务实现了各种JNDI接口——这与JDBC驱动程序针对特定的数据系统实现各种JDBC接口极为相似。作为一名应用程序开发人员,您不需要担心JNDI SPI.。您只需确保,您为每个想使用的命名或目录服务提供了一个服务提供程序。
 
J2SE和JNDI
JNDI被包含在Java 2 SDK 1.3 及其更新版本中。它还可以用作JDK 1.1和1.2的一个标准扩展。 Java 2 SDK 1.4.x的最新版本进行了改进,将以下命名/目录服务提供程序包括进来:    

轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP) 服务提供程序。    
公共对象请求代理架构(Common Object Request Broker Architecture ,CORBA)公共对象服务(Common Object Services ,COS)命名服务提供程序。    
Java远程方法调用( Remote Method Invocation ,RMI)注册表服务提供程序。    
域名系统( Domain Name System ,DNS) 服务提供程序。
 
以上对JNDI概念内涵和外延最权威的解释,遗憾的是,J2EE的文档做得太差了,这点应该像微软学习学习。
 
JNDI的范例程序也很少,在网上广泛流传的是一些与应用服务器结合的实例,如在Tomcat、JBoss、WebLogic中配置了JNDI的数据源,然后在程序中去发现使用。这些例子大家都会,没意思。
 
能否在没有应用服务器的程序中使用JNDI技术呢?经过验证,答案是:可以!
下面给个例子:
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;

public class TestFileSystemJNDI {
        public static void main(String[] args) throws NamingException {
                Hashtable env = new Hashtable();
                String name = "F:\\fscontext-1_2-beta3.zip";
                //文件系统服务的提供者
                env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
                Context ctx = new InitialContext(env);
                //通过上下文查找名称对应的对象
                Object obj = ctx.lookup(name);
                System.out.println("名称:[" + name + "]绑定的对象是:" + obj);
        }
}
 
运行结果:
名称:[F:\fscontext-1_2-beta3.zip]绑定的对象是:F:\fscontext-1_2-beta3.zip

Process finished with exit code 0
 
抓个图看看:

 
注意,JNDI的概念说的明白,你需要有这个服务,才可以用JNDI API来获取。
因此还需要安装文件系统服务。这个例子我不用安装什么服务,下载个文件服务包就行了。其中的两个jar文件就包中的。
 http://java.sun.com/products/jndi/serviceproviders.html
 
JNDI技术的实现很复杂,如果要深入研究,需要花费很大的精力,这个例子也许没什么价值,但对认识JNDI的概念,以及更好的去使用JNDI是很有帮助的。如果要讲解JNDI技术,足足够写一本厚厚的书。
 
J2EE就是这样,把接口留给程序员,把细节实现留给提供商。
 
相关文档:
 http://java.sun.com/javase/6/docs/technotes/guides/jndi/
 http://gceclub.sun.com.cn/staticcontent/html/jndi/index.html
 http://www.lslnet.com/linux/f/docs1/i15/big5174174.htm
 http://www.ibm.com/developerworks/cn/java/j-jndi/
 http://www.chinaunix.net/jh/26/417381.html
 http://www.builder.com.cn/2007/1217/684114.shtml
 http://www.blogjava.net/mashiguang/archive/2008/07/14/214758.html
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深刻理解JNDI 的相关文章

随机推荐

  • Java-模板方法设计模式

    Java 模板方法设计模式 1 概念 2 code举例 package p2 public class TemplateTest public static void main String args Template t new SubT
  • Web API-BOM- 操作浏览器

    Window对象 BOM Browser Object Model 是浏览器对象模型 window 对象下包含了 navigator location document history screen 5个属性 即所谓的 BOM 浏览器对象
  • h5手机端及pc端标准文档结构

    pc端
  • 为什么阻抗等于实加虚部呢?为什么有虚部呢,虚部是什么啊?

    为什么阻抗等于实加虚部呢 为什么有虚部呢 虚部是什么啊 2012 09 25 17 16 江山八秀 分类 物理学 浏览372次 提问者采纳 2012 09 25 17 40 电阻用实部表示 电抗用正的虚部表示 电容用负的虚部表示 一个器件的
  • 系列一、Fate简介及基于Docker的单机部署

    一 Fate简介 Fate是一个工业级联邦学习框架 所谓联邦学习指的就是可以联合多方的数据 共同构建一个模型 与传统数据使用方式相比 它不需要聚合各方数据搭建 数据仓库 联邦学习在联合计算建模的过程中 多方机构之间的数据是不会进行共享的 实
  • C++ ofstream和ifstrem

    原文出自 比特网 转载请保留原文链接 http soft chinabyte com database 460 11433960 sh ofstream是从内存到硬盘 ifstream是从硬盘到内存 其实所谓的流缓冲就是内存空间 在C 中
  • 【问题解决】ElasticSearch分页查询时数据顺序错乱/不一致的问题

    问题解决 ElasticSearch分页查询时数据顺序错乱 不一致的问题 问题描述 使用ElasticSearch分页查询时 每次输入同样的分页参数以及查询条件 得到的结果不一致的问题 问题分析 ElasticSearch中索引可能是由多个
  • mysql in 的两种用法

    简述MySQL 的in 的两种用法 他们分别是在 in 关键字后跟一张表 记录集 以及在in后面加上字符串集 先讲后面跟着一张表的 首先阐述三张表的结构 s sno sname sex age dept 学生信息表 c cno cname
  • 并发编程 三 synchronized

    多线程编程中 有可能会出现多个线程同时访问同一个共享 可变资源的情况 这个资源我们称之其为临界资源 这种资源可能是 对象 变量 文件等 由于线程执行的过程是不可控的 所以需要采用同步机制来协同对对象可变状态的访问 实际上 所有的并发模式在解
  • 双线性插值(超级易懂的)

    双线性插值 简介 在两个方向分别进行一次线性插值 首先在一个方向上使用线性插值 然后再在另一个方向上使用线性插值执行双线性插值 尽管每个步骤在采样值和位置上都是线性的 但是插值总体上不是线性的 而是在采样位置上是二次的 作用 一般用于重新采
  • 手把手带你用PyQt5做小型桌面应用

    导语 想制作属于自己的桌面应用程序吗 今天Disen带你手把手入门 桌面应用 什么是桌面应用 即在操作系统的可视化的桌面上 可以运行的程序 比如说QQ 微信 爱奇艺等这些都是桌面应用 早期开发桌面应用 都用哪些语言呢 桌面应用软件 在操作系
  • SpringMVC + ajaxfileupload的多文件上传

    最近做一个springmvc ajax多文件上传 倒腾了下 查阅了部分资料搞定了 现在分享 1 Spring mvc a xml配置
  • 线性代数的本质(Essense Of Linear Algebra)[1]

    论文转载自https blog csdn net wenzhunpu article details 77871631 最近学习了B站上一个关于线性代数的视频Essense Of Linear Algebra 主要从几何方面去讲解 非常形象
  • Hbase集成到Hadoop的一些注意事项

    安装 部署hadoop和hbase的文章网上已经很多了 这里说下自己安装 部署时遇到的 一些问题 1 hadoop env sh的文件里添加 export HADOOP CLASSPATH HBASE HOME hbase 0 20 3 j
  • 华硕主板怎么进入bios

    bios是电脑的基本输入输出系统 有一些电脑系统设置等需要在bios系统内完成 比如说cpu电压 温度等参数设置 磁盘模式修改 硬盘启动项顺序修改等等都是需要bios内完成 有使用华硕电脑的用户不知道华硕主板怎么进入bios 下面小编就教下
  • 联合Java攻城狮社区,推出Java技能树有奖征文活动,期待你的加入

    目录 一 立志存高远 笃行践初心 二 如何学习Java 三 哪吒造Java技能树 1 CSDN官方技能树 2 哪吒造山寨版Java技能树 3 技能树评委 4 通过打榜赢取精美礼物 5 如何参与Java技能树征文活动呢 四 社区版每日一题活动
  • 用户忠诚度:小程序积分商城的用户保持方法

    随着移动互联网的蓬勃发展 小程序积分商城已经成为了许多企业私域营销的热门选择 这个商城不仅可以吸引用户参与 还可以提高用户的忠诚度 进一步加深用户与品牌的互动关系 然而 要实现用户的忠诚度 需要一系列的策略和方法 本文将深入探讨如何通过小程
  • 源码解析Collections.sort ——从一个逃过单测的 bug 说起

    本文从一个小明写的bug 开始 讲bug的发现 排查定位 并由此展开对涉及的算法进行图解分析和源码分析 事情挺曲折的 因为小明的代码是有单测的 让小明更加笃定自己写的没问题 所以在排查的时候 也经历了前世的500年 去排查排序后的list改
  • 【OpenCV】读入数字图像基础操作学习笔记

    目录 读入数字图像 窗口中显示图像 将图像保存到本地 窗口销毁 打开窗口就要销毁 以免影响后续十月 等待输入 读入数字图像 cv2 imread 所需读入的图像的完整路径 若图像在程序下的文件夹下也可直接输入图像名称 读入图像的形式 读入图
  • 深刻理解JNDI

    JNDI是J2EE的核心技术之一 JNDI的功能简单说就是可以简单的方式去查找某种资源 比如在Tomcat中配置了一个JNDI数据源 那么在程序中之需要用Java标准的API就可以查找到这个数据源 以后数据源配置发生变化了 等等 程序都不需