分享

01

 yespon 2016-09-11

在S2SH开发中会使用的Spring来注入数据源,在本地开发时我们使用<bean>注入数据源

Xml代码  收藏代码
  1. <bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.     <property name="driverClassName" value="${jdbc.driverClassName}" />  
  3.     <property name="url" value="${jdbc.url}" />  
  4.     <property name="username" value="${jdbc.username}" />  
  5.     <property name="password" value="${jdbc.password}" />  
  6.     <property name="maxActive" value="${jdbc.maxActive}" />  
  7. </bean>  

 

上面的配置文件取自Spring中,有了dataSourceSpied就可以将这个数据源引入到hibernate的sessionFactory

Xml代码  收藏代码
  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  2.     <!-- 配置sessionFactory中要用的数据源 -->  
  3.     <property name="dataSource" ref="dataSourceSpied" />  
  4.     ...  
  5. </bean>  

 

但是在生产上,或者测试环境数据库的链接、用户名、密码都是很重要的信息,不能直接暴露在外面。所以在生成、测试环境我们会使用JNDI这种服务来得到数据库链接

Xml代码  收藏代码
  1. <jee:jndi-lookup id="dataSourceSpied" jndi-name="dataSourceDBaihis" />  

然后再web服务器上创建数据源。我们使用weblogic11这种web服务器,在上面创建数据源,数据源的名字叫做“dataSourceDBaihis”这样在Spring配置文件中使用:

Xml代码  收藏代码
  1. <jee:jndi-lookup id="dataSourceSpied" jndi-name="dataSourceDBaihis" />  

就能得到数据源。

那么什么叫做JNDI呢?

JNDI:Java Naming and Directory Interface,Java命名和目录接口

是一种命名服务的抽象机制,用通俗的话讲就是:我知道在网络上有一个对象,并且知道这个对象的名字和网络地址,那么我可以通过JNDI来获得这个网络上的对象

非通俗解释:

JNDI的目的是用来查找J2EE服务器的注册资源。只要该对象在命名服务器上注册过,且你知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。这样你就可以在无需知道对象位置的情况下获取和使用对象。

拿上面介绍的数据源来说明:

项目中没有正在实例化数据源,只是通过jndi-lookup呼叫了一个数据。我知道数据源的名字,因为项目部署在weblogic上,所以项目自然知道这个数据源的地址。所以项目知道了数据源对象的地址和数据源的名称,这样就可以通过JNDI获得这个数据,并注入到hibernate中。

 

Java对JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现。这就类似与Java的JDBC,Java也只是提供了JDBC的接口,各个数据库厂家提供接口的实现。开发过程中程序员不用关心厂家是如何实现的,只需要面向接口编程即可。

以上完全是停留在概念上理解什么是JNDI,下节将要介绍两个简单的例子,这样我们可以更加清晰的认识到JNDI是如何获得远程对象的。先在这里做个小铺垫,因为Java只提供了JNDI的接口,所以在写demo过程中要用到厂家提供的实现。我在这里列举了各个厂家提供的链接和工厂类:

Java代码  收藏代码
  1. //jboss:  
  2. Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"  
  3. Context.URL_PKG_PREFIXES, "org.jboss.naming"  
  4. Context.PROVIDER_URL, "localhost:1099"  
  5.   
  6. //weblogic:  
  7. Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"  
  8. Context.PROVIDER_URL, "t3://localhost:7001"  
  9.   
  10. //apusic(金蝶):  
  11. Context.INITIAL_CONTEXT_FACTORY, "com.apusic.jndi.InitialContextFactory"  
  12. Context.PROVIDER_URL, "rmi://localhost:6888"  
  13.   
  14. //WebSphere:  
  15. Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"  
  16. Context.PROVIDER_URL, "iiop://localhost:900"  
  17.   
  18.   
  19. //J2EE  SDK(J2EE  RI):  
  20. Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"  
  21. Context.PROVIDER_URL, "iiop://127.0.0.1:1050"  
  22.   
  23. //SilverStream:  
  24. Context.INITIAL_CONTEXT_FACTORY, "com.sssw.rt.jndi.AgInitCtxFactory"  
  25. Context.PROVIDER_URL, "sssw://localhost:80"  
  26.   
  27. //OC4J:  
  28. Context.INITIAL_CONTEXT_FACTORY, "com.evermind.server.rmi.RMIInitialContextFactory"  
  29. Context.PROVIDER_URL, "ormi://127.0.0.1/"  
  30.   
  31. //WAS5:  
  32. Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"  
  33. Context.PROVIDER_URL, "iiop://localhost:2809"  

 解释一下上述代码:

Context.INITIAL_CONTEXT_FACTORY:指定到目录服务的连接工厂
Context.PROVIDER_URL:目录服务提供者URL

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多