zoukankan      html  css  js  c++  java
  • JNDI + Spring 如何读取数据

    首先来谈谈什么是JNDI:

      JNDI官方给出的定义是:Java Naming and Directory Interface,Java命名和目录接口.

      而JNDI实际的作用就是将一些资源信息与java对象关联起来。

      在JAVA开发中 使用到最多的场景则是与数据源的配置。当然数据源信息可以以固定的参数形式写在xml中,然后通过dataSource进行数据库的连接。

      而JNDI的加入可以将数据源的信息与java项目解耦,通过在J2EE容器中配置JNDI参数,定义一个数据源,并给这个数据源命名。

      然后在程序里直接引用这个JNDI的名称,既可通过名称访问对应JNDI所定义的数据源。这样做的优点就是实现数据源信息与程序解耦

      如果当数据源发生变更则可以直接修改容器中数据源的资料即可,只要程序中数据源的名称与JNDI的名称保持不变,那么程序就无需做任何改变。

    这几天一直在研究JNDI 是如何读取数据的。发现针对不同的服务器(tomcat,weblogic.....)JNDI的初始化配置是不同的。

    先看看正常java代码的实现过程:

    tomcat

    首先要在tomcat conf/context文件中配置好数据。例如

        

    <Resource name="jdbc/test"  
              auth="Container"   
              type="javax.sql.DataSource" 
              driverClassName="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://127.0.0.1/test" 
              username="root" 
              password="root" 
              maxActive="20" 
              maxIdle="10" 
              maxWait="-1"/> 

    数据库的参数就不一一介绍了

    name:表示JNDI可以通过这个name属性找到这段数据

    auth:表示由容器进行授权管理,使得数据库的帐号密码可以在容器上生效(对于其他不需要用户密码的数据就不需要 该属性了)

    Type:现在是定义dataSource这个类的全路径,也可以是自己定义的类,如果是自己定义的类 想让JNDI识别出来的话需要加上

    factory="org.apache.naming.factory.BeanFactory"

    这个beanFactory也是Spring管理bean的根接口,所以当使用到自定义的类的时候需要加上这个属性。不然JNDI无法识别你自定义的类

    java代码

    InitialContext  initCtx = new InitialContext();
    DataSource data = (DataSource) initCtx.lookup("java:comp/env/jdbc/test");

     单纯的使用main方法执行上面的代码是无效的,因为我们的参数是存放在tomcat的容器内,所以需要将上面的代码与项目同时启动,才能读取到数据。

    这个时候data对象内的参数就是resource中定义的参数内容了!!

    weblogic

    weblogic的数据可以以properties文件的形式放在weblogic目录中

            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
            env.put(Context.PROVIDER_URL, "t3://localhost:7000");
            InitialContext  initCtx = new InitialContext(env);
            Object data = (DataSource) initCtx.lookup("resouce");

    initialContext只支持hashTable,所以我们将参数封装好,再初始化JNDI。上面说到每个服务器对JNDI的支持都大同小异,而weblogic.jndi.WLInitialContextFactory 就是weblogic对JNDI的初始化接口。

    针对不同的服务器他们接口的路径也不同,例如JBoss则是org.jnp.interfaces.NamingContextFactory这个路径,所以这个Factory参数要以具体情况定义,tomcat是不需要的哟!!URL就是

    服务器weblogic的地址。而T3也是一种协议,只是他是weblogic特有的。lookup的参数也有所不同,weblogic对应的是properties文件的名字即可 也可以是一整个文件路径,而根目录就是weblogic,然后往下查找

    (weblogic.jms.jade.Ord_TPC)类似这样,用点号来做文件夹的区分。 上诉tomcat中用的是java:comp/env这样的形式,这个是web特有的。即java:comp/env/xxx/xxx代表的就是context中配置的数据了。

    使用spring配置来加载数据

    <!--jndi环境配制 -->
        <bean id="jndiTopicTemplate" class="org.springframework.jndi.JndiTemplate">
            <property name="environment">
                <props>
                    <prop key="java.naming.factory.initial">
                        weblogic.jndi.WLInitialContextFactory
                    </prop>
                    <prop key="java.naming.provider.url">
                        ${jms.broker.url}
                    </prop>
                </props>
            </property>
        </bean>
    
        
        <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName" value="${topic.factory.name}" />
            <property name="jndiTemplate" ref="jndiTopicTemplate" />
        </bean>

    这个时候dataSource就是一个带有连接配置参数的对象,可以在spirng中直接引用即可。

    上面介绍了这么多用法,JNDI适用的场景我觉得还是,有些配置(比如数据库这样正式的连接地址不宜暴露的时候)可以使用这样的方式来配置,让使用这个连接的人只能使用,却

    没法具体知道具体的数据是怎么样的。对于大企业的保密工作应该是个不错的支持吧!!!

  • 相关阅读:
    java基础英语---第十九天
    java基础英语---第十六天
    java基础英语---第十七天
    java基础英语---第十四天
    java基础英语---第十五天
    java基础英语---第十三天
    设计模式
    设计模式
    设计模式
    设计模式
  • 原文地址:https://www.cnblogs.com/culushitai/p/8670510.html
Copyright © 2011-2022 走看看