JavaEE规范学习(一)--- JNDI
JNDI(JavaNaming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性。
集群JNDI实现了高可靠性JNDI,通过服务器的集群,保证了JNDI的负载平衡和错误恢复。在全局共享的方式下,集群中的一个应用服务器保证本地JNDI树的独立性,并拥有全局的JNDI树。每个应用服务器在把部署的服务对象绑定到自己本地的JNDI树的同时,还绑定到一个共享的全局JNDI树,实现全局JNDI和自身JNDI的联系。
JNDI(JavaNaming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。现在JNDI已经成为J2EE的标准之一,所有的J2EE容器都必须提供一个JNDI的服务。
JNDI可访问的现有的目录及服务有:
DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1 v2、NIS。
何时使用JNDI
JNDI是一种查找服务,用于查找:
Web应用环境变量
EJBs和他们的环境变量
通过DataSources的数据库连接池
JMS目标和连接工厂
备注:不要讲JNDI当做数据库使用,因为JDNI对象存储在内存中,访问JDNI对象与网络性能有关(网络好的时候查找性能高)。
JNDI必备知识
JNDI树
在EJB中使用properties文件使用JNDI
jndi.properties文件内容
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost
备注:jndi.properties文件为所有的InitialContexts设置默认的属性,jndi.properties文件的搜索次序
·CLASSPATH
·$JAVA_HOME/lib
从JNDI查找
·Lookup()从JNDI树获取对象
//在JNDI树上查找“UserManagerBean对象 UserManager userManager =(UserManager)ctx.lookup("UserManagerBean/remote"); User user = new User(); user.setUserName("cody"); user.setPossword("0909"); //使用查找到对象的方法 userManager.addUser(user); //连接完成之后关闭访问资源 ctx.close();
·绑定到远程命名服务的对象必须是序列化的
·访问命名服务时,对象是采用复制机制
EJB是如何绑定远程访问对象的?
EJB通过@Remote注解将对象绑定到JNDI树上
System.out.println("User[userName="+user.getUserName()+"]已经被成功保存"); user.setId(10); }
J2EE规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java ManagementExtensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。
在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。
相关文章
- 【SQL 学习】排序问题之order by与索引排序
- Groovy学习记录-------Groovy安装/配置
- C# Winform学习--- 实现石头剪刀布的游戏
- Android学习---数据库的增删改查(sqlite CRUD)
- AngularJS学习---更多模板(More Templating) step 8
- 【学习总结】网络-TCP拥塞控制
- gpg加解密软件学习
- C# Winform学习--- 实现石头剪刀布的游戏
- jsp学习--JavaBean定义和在Jsp中使用JavaBean
- linux命令学习——md5sum
- RHCE 学习笔记(14)- 文件系统(2) - 搜索文件
- 大数据运维---Zookeeper学习
- H3CNE学习---PPP、三层链路聚合、VRRP
- Android开发学习笔记(七)表格布局TableLayout
- Spring读源码系列之AOP--03---aop底层基础类学习
- Flutter学习 — 设计基础
- 【阶段四】Python深度学习03篇:深度学习基础知识:神经网络可调超参数:激活函数、损失函数与评估指标
- Python Flask框架学习06:Flask 变量规则
- Python学习50:使用元类
- 前端框架Vue------>第一天学习、Vue学习的路径、Vue官网(1)
- 一脸懵逼学习oracle(图形化界面操作---》PLSQL图形化界面)
- 一脸懵逼学习Hdfs---动态增加节点和副本数量管理(Hdfs动态扩容)
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第七步---英雄要升级&属性--解析csv配置文件
- 迁移学习
- 排序学习之---快速排序
- golangWeb框架---github.com/gin-gonic/gin学习八(监听多端口、多类型的struct模型绑定)
- 【文献学习】Multipath Rayleigh and Rician Fading Channel Simulation Using MATLAB
- AcWing算法学习---dfs
- Gorm框架学习---CRUD接口之查询
- Linux学习笔记之---Anaconda【好用!】
- 深度学习中的激活函数有哪些?
- 学习C++:C++进阶(四)CMake应用篇---打包、部署和安装 CMake 项目