JNDI简介

JNDI(The Java Naming and Directory Interface,Java 命名和目录接口)
    是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和
    目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、
    网络、对象服务等。
   
    命名服务:就像DNS 一样,通过命名服务器提供服务,大部分的J2EE服务器都含有命名服务器。
    目录服务:一种简化的 RDBMS 系统,通过目录具有的属性保存一些简单的信息。
        目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY 等。

   
JNDI 是java提供的一组接口,不同的应用程序可以有不同的jndi接口的实现。通过对不同的jndi的实现
    就可以通过jndi格式的字符串来(定位)访问相应的资源。
    和多数java服务一样,SUN对JNDI也只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现:
    各WEB容器的JNDI实现类是不同的,比如在JBOSS中,JNDI提供类是
    org.jnp.interfaces.NamingContextFactory,与tomcat是不同的。
   
    通过配置一个JNDI字符串,让其它程序能够通过这个配置找到并加载该资源。比如spring的依赖注入,
    通过bean标签的配置,将一个bean的所在路径,属性等信息标明,其它程序就可以使用这个JNDI来加载
    该bean类。

JNDI 与 静态变量的区别:
    一个静态变量只能在本地程序中使用,但如果是跨域的跨进程的程序间要访问某一特定的资源就要使用
    JNDI 来进行访问。
   
    JNDI主要作用是为分布式开发作服务的,当你需要网络上其它主机给你提供服务时候,可以将该主机的服
    务注册成JNDI,之后直接从JNDI处获取服务.
   
通过JNDI来加载程序交互所需的对象,你无需知道该对象的具体类以及某些属性的值,你就可以获得该对象,并
    进行使用。现在一般的公司服务器都是配置好了JNDI,然后给你JNDI名称,你无需知道数据库用户名和密码
    (也有可能不想告诉你)。
   
大部分程序就是通过加载xml文件,将所有的JNDI解析成键值对存储在map中,然后初始化 javax.naming.Context
    然后调用 lookup("JNDI KEY NAME") 方法来获得指定的资源。
    java.naming.factory.initial 该 key 指向加载资源的类,也就是外部程序会调用该类来加载指定的资源。
    该类由资源提供方提供。
   
    一般 web 服务器启动的时候就会将一些参数存到 System.properties 中这样,后面的代码如果要查JNDI,
    直接new InitialContext()就可以了
   
示例:
    tomcat server.xml  配置JNDI
       

<Resource  
        name="jdbc/test" <!-- JNDI数据池名称 -->  
        type="javax.sql.DataSource" <!-- 数据类 -->  
        password="karid"     <!-- 密码 -->  
        driverClassName="oracle.jdbc.driver.OracleDriver"  <!-- 驱动 -->  
        maxIdle="2"               <!-- 最少可用lia -->  
        maxWait="5000"        <!-- 最大等待时间 5秒 -->  
        username="karid"       <!-- 用户名 -->  
        url="jdbc:oracle:thin:@127.0.0.1:1521:karid"  
        maxActive="4" <!-- 最大可用连接 --> />       

 
    web.xml    引用JNDI资源
       

<description>MySQL Test App</description>
        <resource-ref>
             <description>DB Connection</description>
             <res-ref-name>jdbc/test</res-ref-name>
             <res-type>javax.sql.DataSource</res-type>
             <res-auth>Container</res-auth>
        </resource-ref> 

 
    java       加载初始化JNDI资源
      

 Context initContext = new InitialContext();  
        if (initContext == null)  
            System.out.println("无配置环境");  
        Context envContext = (Context) initContext.lookup("java:/compenv");  
        ds = (DataSource) envContext.lookup("jdbc/test"); //根据名称取得数据源   

 
     
示例2:
    JNDI
       

<Context path="/jndi">
            <Resource name="bean/MyBeanFactory" auth="Container"
                    type="com.huawei.jndi.bean.MyBean"
                    factory="org.apache.naming.factory.BeanFactory"
                    bar="23"/>
        </Context> 

 
    java
       

Context initContext = new InitialContext(); 
        Context envCtx = (Context) initContext.lookup("java:comp/env"); 
        MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); 
        System.out.println(bean.getBar());  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值