JNDI基础

一、JNDI 介绍

1、什么是 JNDI

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一个Java API,允许 Java 应用程序与命名和目录服务进行交互。这些服务可以是本地的,也可以是分布式的,可以基于各种协议,如LDAP(轻量级目录访问协议)、DNS(域名系统)、NIS(网络信息服务)等。

JNDI 的主要目的是为了统一不同命名和目录服务的访问方式,使得Java应用程序能够以一种统一的方式来访问这些服务,而不必关心底层的实现细节。通过 JNDI,开发人员可以编写与特定命名服务提供者无关的代码,从而实现应用程序的可移植性和灵活性。

JNDI 可以访问的目录及服务,比如:DNS、LDAP、CORBA对象服务、RMI等等。

简单理解:在前面一节我们学到了 RMI,比如 RMI 对外提供了服务,那么 JNDI 可以通过相关 API 链接处理这些服务。

1.1、命名服务 Naming Service

命名服务提供了将名称与对象关联映射的机制。在 Java 中,这些对象通常是网络资源、Java对象、文件、服务等。命名服务允许开发人员使用简单的名称来访问这些对象,而不需要知道其底层的物理位置或其他详细信息。例如,一个Web应用程序可能需要连接到一个数据库,而不需要知道数据库的确切位置。通过命名服务,开发人员可以为数据库分配一个简单的名称,并在需要时通过该名称访问它。

1.2、目录服务 Directory Service

目录服务扩展了命名服务的概念,提供了一种更加结构化和查询友好的方式来组织和管理对象。目录服务通常被用来存储和检索关于用户、组织、网络资源等信息的数据。与命名服务类似,目录服务也使用名称来引用对象,但它们提供了更丰富的查询功能,使得可以根据各种属性进行搜索和过滤。

2、JNDI 的五个包

在 JNDI 中提供了五个作用不同的包。

  • javax.naming
  • javax.naming.directory
  • javax.naming.ldap
  • javax.naming.event
  • javax.naming.spi

2.1、javax.naming

它包含了命名服务的类和接口。比如其中定义了Context接口,可以用于查找、绑定/解除绑定、重命名对象以及创建和销毁子上下文等操作。这个也是我们比较关注的一个包。

  • 查找

最常用的操作是lookup()。你向lookup()提供你想要查找的对象的名称,它返回与该名称绑定的对象。

  • 绑定

listBindings()返回一个名字到对象的绑定的枚举。绑定是一个元组,包含绑定对象的名称、对象的类的名称和对象本身。

  • 列表

list()与listBindings()类似,只是它返回一个包含对象名称和对象类名称的名称枚举。list()对于诸如浏览器等想要发现上下文中绑定的对象的信息但又不需要所有实际对象的应用程序来说非常有用。

  • 引用

在一个实际的名称服务中,有些对象可能无法直接存储在系统内,这时它们便以引用的形式进行存储。

2.1.1、InitialContext类

构造方法:

InitialContext() 
构建一个初始上下文。  
InitialContext(boolean lazy) 
构造一个初始上下文,并选择不初始化它。  
InitialContext(Hashtable<?,?> environment) 
使用提供的环境构建初始上下文。

常用方法:

bind(Name name, Object obj) 将名称绑定到对象。 
list(String name) 枚举在命名上下文中绑定的名称以及绑定到它们的对象的类名。
lookup(String name) 检索命名对象。 
rebind(String name, Object obj) 将名称绑定到对象,覆盖任何现有绑定。 
unbind(String name) 取消绑定命名对象。
2.1.2、Reference类

构造方法:

Reference(String className) 为类名为“className”的对象构造一个新的引用。  
Reference(String className, RefAddr addr) 为类名为“className”的对象和地址构造一个新引用。  
Reference(String className, RefAddr addr, String factory, String factoryLocation) 为类名为“className”的对象,对象工厂的类名和位置以及对象的地址构造一个新引用。  
Reference(String className, String factory, String factoryLocation) 为类名为“className”的对象以及对象工厂的类名和位置构造一个新引用。

常用方法:

void add(int posn, RefAddr addr) 将地址添加到索引posn的地址列表中。  
void add(RefAddr addr) 将地址添加到地址列表的末尾。  
void clear() 从此引用中删除所有地址。  
RefAddr get(int posn) 检索索引posn上的地址。  
RefAddr get(String addrType) 检索地址类型为“addrType”的第一个地址。  
Enumeration<RefAddr> getAll() 检索本参考文献中地址的列举。  
String getClassName() 检索引用引用的对象的类名。  
String getFactoryClassLocation() 检索此引用引用的对象的工厂位置。  
String getFactoryClassName() 检索此引用引用对象的工厂的类名。    
Object remove(int posn) 从地址列表中删除索引posn上的地址。  
int size() 检索此引用中的地址数。  
String toString() 生成此引用的字符串表示形式。

官方详细介绍:

https://docs.oracle.com/javase/tutorial/jndi/overview/naming.html

2.2、javax.naming.directory

继承了 javax.naming,提供了除命名服务外访问目录服务的功能。

官方详细介绍:

https://docs.oracle.com/javase/tutorial/jndi/overview/dir.html

2.3、javax.naming.ldap

继承了 javax.naming,提供了访问 LDAP 的能力。

官方详细介绍:

https://docs.oracle.com/javase/tutorial/jndi/overview/dir.html

2.4、javax.naming.event

包含了用于支持命名和目录服务中的事件通知的类和接口。

官方详细介绍:

https://docs.oracle.com/javase/tutorial/jndi/overview/event.html

2.5、javax.naming.spi

允许动态插入不同实现,为不同命名目录服务供应商的开发人员提供开发和实现的途径,以便应用程序通过 JNDI 可以访问相关服务。

官方详细介绍:

https://docs.oracle.com/javase/tutorial/jndi/overview/event.html

推荐拓展学习:

Page not found

https://docs.oracle.com/javase/tutorial/jndi/overview/index.html

二、JNDI 操作 RMI

1、创建工程

我们在RMI基础的代码中进行一些修改。

打开rmidemo项目,在src.main.java下新建一个名为jndi的目录,并在该目录下分别新建两个名为JndiClient,JndiServer的Java Class。如下图所示:

2、JndiServer 代码

在JndiServer中键入以下代码,最终如下图所示:

package jndi;import method.SayHelloImpl;
import javax.naming.InitialContext;public class JndiServer {public static void main(String[] args)throws Exception {InitialContext initialContext = new InitialContext();initialContext.rebind("rmi://127.0.0.1:1099/sayhello",new SayHelloImpl());System.out.println("启动成功...");}
}

3、JndiClient 代码

在JndiClient中键入以下代码,最终如下图所示:

package jndi;import method.SayHello;
import javax.naming.InitialContext;public class JndiClient {public static void main(String[] args) throws Exception {InitialContext initialContext = new InitialContext();SayHello sayHello = (SayHello)initialContext.lookup("rmi://127.0.0.1:1099/sayhello");System.out.println(sayHello.sayhello("Power7089"));}
}

4、运行项目

①、先启动RmiServer。

②、再启动JndiServer。

③、最后启动JndiClient。

观察运行结果。

三、JNDI 操作 DNS

使用 JNDI 向 DNS 服务查询某域名 IP 地址。

import javax.naming.*;
import javax.naming.directory.*;
import java.util.Hashtable;public class JNDIDNSLookup {public static void main(String[] args) {try {// 设置JNDI属性Hashtable<String, String> env = new Hashtable<>();env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");// DNS服务器地址env.put(Context.PROVIDER_URL, "dns://114.114.114.114");// 创建JNDI上下文对象DirContext ctx = new InitialDirContext(env);// 要查找的DNS名称String dnsName = "github.com";// 获取DNS记录的属性集合,只获取IPv4地址(A记录)Attributes res = ctx.getAttributes(dnsName, new String[]{"A"});// 获取IPv4地址属性Attribute attr = res.get("A");if (attr != null) {// 遍历并输出所有IPv4地址NamingEnumeration<?> ips = attr.getAll();while (ips.hasMore()) {System.out.println("IPv4 Address for " + dnsName + ": " + ips.next());}} else {System.out.println("No IPv4 Address found for " + dnsName);}// 关闭上下文ctx.close();} catch (NamingException e) {e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastdds:idl

1使用网络收发数据的最简单方式 在学习idl之前&#xff0c;先来看一下我们在开发中&#xff0c;通过网络收发数据时&#xff0c;常常怎么实现。 struct Student {char name[32];int age;char sex;// f 男&#xff0c;m 女 };//发送侧 struct Student s1 {"xiaoming&q…

计算机网络之多路转接epoll

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之多路转接epoll 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

Windows server 服务器网络安全管理之防火墙出站规则设置

Windows server 服务器网络安全管理之防火墙出站规则设置 创建一条出站规则 这条出站规则针对IE浏览器设置&#xff0c;指定路径 TCP协议和指定端口&#xff08;多个端口的写法要注意&#xff09; 所有IP&#xff0c;所有应用&#xff0c;都采用阻止 给这条规则进行命名…

jmeter 接口性能测试 学习笔记

目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1&#xff1a;测试接口接口准备线程组添加线程组配置线程组值线程数&#xff08;Number of Threads&#xff09;Ramp-Up 时间&#xff08;Ramp-Up Period&#xff09;循环次数&#xff08;Loop Count&…

Pytorch | 从零构建ResNet对CIFAR10进行分类

Pytorch | 从零构建ResNet对CIFAR10进行分类 CIFAR10数据集ResNet核心思想网络结构创新点优点应用 ResNet结构代码详解结构代码代码详解BasicBlock 类ResNet 类ResNet18、ResNet34、ResNet50、ResNet101、ResNet152函数 训练过程和测试结果代码汇总resnet.pytrain.pytest.py 前…

gpu硬件架构

1.简介 NVIDIA在视觉计算和人工智能&#xff08;AI&#xff09;领域处于领先地位&#xff1b;其旗舰GPU已成为解决包括高性能计算和人工智能在内的各个领域复杂计算挑战所不可或缺的。虽然它们的规格经常被讨论&#xff0c;但很难掌握各种组件的清晰完整的图景。 这些GPU的高性…

Java中的方法重写:深入解析与最佳实践

在Java编程中&#xff0c;方法重写&#xff08;Method Overriding&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念之一。它允许子类提供一个与父类中同名方法的具体实现&#xff0c;从而实现多态性&#xff08;Polymorphism&#xff09;。本文将深入探讨Java…

使用vcpkg安装opencv>=4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效

使用vcpkg安装opencv>4.9后#include<opencv2/opencv.hpp>#include<opencv2/core.hpp>无效\无法查找或打开 至少从2024年开始&#xff0c;发布的vcpkg默认安装的opencv版本都是4.x版。4.8版本及以前&#xff0c;vcpkg编译后的opencv头文件目录是*/vcpkg/x64-win…

基于java web在线商城购物系统源码+论文

一、环境信息 开发语言&#xff1a;JAVA JDK版本&#xff1a;JDK8及以上 数据库&#xff1a;MySql5.6及以上 Maven版本&#xff1a;任意版本 操作系统&#xff1a;Windows、macOS 开发工具&#xff1a;Idea、Eclipse、MyEclipse 开发框架&#xff1a;SpringbootHTMLjQueryMysq…

基于字节大模型的论文翻译(含免费源码)

基于字节大模型的论文翻译 源代码&#xff1a; &#x1f44f; star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型&#xff08;Large Language Model, LLM&#xff09;的论文阅读与翻译辅助工具。它通过用户界面&#xff08…

centos7下docker 容器实现redis主从同步

1.下载redis 镜像 docker pull bitnami/redis2. 文件夹授权 此文件夹是 你自己映射到宿主机上的挂载目录 chmod 777 /app/rd13.创建docker网络 docker network create mynet4.运行docker 镜像 安装redis的master -e 是设置环境变量值 docker run -d -p 6379:6379 \ -v /a…

实现 WebSocket 接入文心一言

目录 什么是 WebSocket&#xff1f; 为什么需要 WebSocket&#xff1f; HTTP 的局限性 WebSocket 的优势 总结&#xff1a;HTTP 和 WebSocket 的区别 WebSocket 的劣势 WebSocket 常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 WebSocket 心跳机制 …

机动车油耗计算API集成指南

机动车油耗计算API集成指南 引言 在当今社会&#xff0c;随着机动车数量的持续增长和环保意识的不断增强&#xff0c;如何有效管理和降低车辆油耗成为了车主、车队管理者以及交通政策制定者共同关注的问题。为了帮助这些群体更好地理解和优化燃油消耗情况&#xff0c;本接口能…

前端yarn工具打包时网络连接问题排查与解决

最近线上前端打包时提示 “There appears to be trouble with your network connection”&#xff0c;以此文档记录下排查过程。 前端打包方式 docker启动临时容器打包&#xff0c;命令如下 docker run --rm -w /app -v pwd:/app alpine-node-common:v16.20-pro sh -c "…

IIC I2C子协议 SMBus协议 通信协议原理 时序 SMBus深度剖析

引言&#xff1a;系统管理总线&#xff08;SMBus&#xff09;是一种双线接口&#xff0c;通过该接口&#xff0c;各种系统组件芯片和设备可以相互以及与系统其他部分通信。它基于IC总线的操作原理。附录B提供了一些SMBus特性与IC总线不同的方式的描述。 SMBus为系统和电源管理相…

【Lua热更新】上篇

Lua 热更新 - 上篇 下篇链接&#xff1a;【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…

React图标库: 使用React Icons实现定制化图标效果

React图标库: 使用React Icons实现定制化图标效果 图标库介绍 是一个专门为React应用设计的图标库&#xff0c;它包含了丰富的图标集合&#xff0c;覆盖了常用的图标类型&#xff0c;如FontAwesome、Material Design等。React Icons可以让开发者在React应用中轻松地添加、定制各…

如何使用 WebAssembly 扩展后端应用

1. WebAssembly 简介 随着互联网的发展&#xff0c;越来越多的应用借助 Javascript 转到了 Web 端&#xff0c;但人们也发现&#xff0c;随着移动互联网的兴起&#xff0c;需要把大量的应用迁移到手机端&#xff0c;随着手端的应用逻辑越来越复杂&#xff0c;Javascript 的解析…

Fastdfs V6.12.1集群部署(arm/x86均可用)

文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统&#xff0c;特别适合用于存…