Java-JNDI详解

前记

最近一直在看Spring 的官方文档,突然间发现自己平时用的很多东西都只是一知半解的,浏览器查询出来的解决办法也没有能表达出原作者的意思,并且用到了很多的Java 的基础内容。

要是现在突然再回去补习Java 的基础知识也不现实,所以现在都是根据看到的Spring 的原理所依赖的Java 基础再来进行弥补以前不会的Java 基础。

切记,学习一样东西,如果你没有深刻领悟作者的思路,那么你也仅仅只是学会了使用工具,而没有学会造工具。


基础

JNDI 即Java Naming and Directory Interface(JAVA 命名和目录接口),那么Java 命名的目的就是为了记录一些不方便记录的内容,就像DNS 中的域名与IP 的关系,存在一一对应的关系。

JNDI 被定义为独立于任何特定的目录服务实现。因此,可以以通用方式访问各种目录。

优势

在说优势的时候,我觉得那就要说说没有JNDI 之前的时候是如何进行开发的,还是在大部分的JNDI 介绍中都会出现的数据库连接的问题。

  • 数据库服务器名称MyDBServer、 username 和password 都可能需要改变,由此引发JDBC URL 需要修改。
  • 数据库可能改用别的产品,如改用DB2 或者Oracle ,引发JDBC 驱动程序包和类名需要修改。
  • 随着实际使用终端的增加,原配置的连接池参数可能需要调整。

解决

为了解决上述的问题,所以就有了Java JNDI,大部分有过开发经验的基本上都知道,在将代码和外部资源进行绑定之后是很容易出现问题的,比如写死的参数。这在后续的程序调试中会出现很麻烦的问题。

因此,J2EE 规范要求所有J2EE 容器都要提供JNDI 规范的实现。JNDI 在J2EE 中的角色就是交换机,J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。
在多数情况下,提供JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。
JNDI 在J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。

应用

在使用JNDI 之后,现在在连接数据库时的配置方式:

1
2
3
4
5
6
7
spring:
datasource:
continue-on-error: false
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false
username: root
password: ***

Spring 还提供了profiles 机制,这样可以很方便的根据环境使用配置信息。


JNDI 架构

x2Rll.png

至此要使用JNDI ,还必须具有JNDI 类和一个或多个服务提供程序。

Java 2 SDK v1.3包括三个用于以下命名/目录服务的服务提供者:

  • 轻型目录访问协议(LDAP )。
  • 通用对象请求代理体系结构(CORBA )通用对象服务(COS )名称服务。
  • Java远程方法调用(RMI )注册表。

因此,基本上,您可以创建对象并将其注册到目录服务中,以供日后查找和执行操作。


后记

引用

https://www.ibm.com/developerworks/cn/java/j-jndi/index.html

总结

有一个古老的计算机科学笑话:每个编程问题都可以仅仅用一个抽象层(或间接的)来解决。在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,但还没有紧到无法让人很容易地把它们分开并重新装配。JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。实际上,它要比许多人想像的容易得多。


个人备注

此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!