Spring2.0JNDI集成(1)

原创 2007年09月29日 08:49:00

JNDI 是JAVAEE 平台技术中最重要的基础支撑技术之一。他为各种Java对象进行命名,并采用目录层次结构管理它们,借助于JNDI API能够操控各种JAVA对象。实际上,JAVAEE5 引入各种Annotation注释(比如,@EJB,@Resource)底层采用JNDI API查找 JavaEE 容器受管资源(比如,EJB3.0组件,JDBC DataSource,JMS ConnectionFactory),并注入到那些应用了Annotation注释的JavaEE组件 (比如,Servlet,JSF后端Bean,EJB3.0组件)中。
Spring2.0针对JNDI API的使用提供了JNDI集成,org.springframework.jndi包就是见证。在Spring 1.x使能应用中,JndiObjectFactoryBean是Spring开发者使用最频繁的工厂Bean,而JndiTemplate模板的使用也 非常频繁。自从Spirng 2.0开始,<jndi-lookup/>内容模式被引入到JNDI集成工作中。此后,<jidi-lookup/>便代替了 JnidObjectFactoryBean的地位,当然JndiObjectFactoryBean是<jndi-lookup/>底层采 用的工厂Bean。
本章从介绍JNDI背景知识及实例入手,进而进入到Spring提供的JNDI集成支持中。随后,Spring2.0引入的<jndi-lookup/>内容模式被介绍到。

背景知识及示例
现有的企业当中,存在各式各样的命名和目录服务。何谓命名和目录服务?命名和目录服务是同过名字,目录形式来管理系统中的对象,无力设备等内容的一种服 务。比如,微软活动目录(AD)、OpenDAP服务器。为了通过应用操纵它们,开发者需要借助于响应的客户端API或客户软件
在JNDI出现之前,开发者只能够通过专有方式操作命名和目录服务,这无疑加大了开发者的学习负担。甚至,企业的实现环境都是异构的,哪怕是同一种目录服务器都会因为运行的操作系统的不同而提供多套客户端API。
JNDI,即Java命名目录服务接口(Java Naming and Directory Interface),它能够对命名和目录服务器进行CRUD操作,这同JDBC与RDBMS的关系类似。只要命名和目录服务器厂商提供对应的JNDI实 现,开发者便能够一致地通过接口操纵它们,从而避免了与厂商绑定的风险。
类似于DNS,JNDI能够讲对象赋予有意义的名字。在DNS中,通过逻辑能够实现对IP地址的映射。在JNDI中,通过预先绑定的名字能够找到目标服务 或者对象。比如,借助于JNDI,我们能通过“java.:/AgileSpringDS”名字获得javax.sql.DataSource对象。这些 都是通过Java命名系统获得的。JNDI在Java SE/Java EE中起到了很重要的作用,正如DNS在当今的因特网中的地位一样,而且会越来越重要。比如,Web服务的兴起、SOA架构的兴起,会使得JNDI在应用 中扮演关键角色。
通常,Java EE应用服务器(比如,GlassFish,JBoss)都会提供命名或目录服务实现(或称为服务提供者)。BEA WebLogic内部采用了LDAP服务器完成登录用户的认证。同样地,在Java SE环境开发中也可以使用本地JNDI服务提供者(而不是由Java EE服务器提供的)。通过http://java.sun.com/products/jidi/serviceproviders.html,开发者能 够浏览到很多JNDI服务提供者。这里,我们以 File System提供者为例。如果开发者熟悉IBM WebSphere MQ,则应该知道他的JNDI实现这是在File System基础之上开发的。打开Eclipse filesystemjndidemo项目,来分析如下代码。

代码
  1. Hashtable<String,String> env = new Hashtable<String,string>(2);  
  2. //设定上下文工厂  
  3. Env.put(Context.INITIAL_CONTEXT_FACTORY,”com.sun.jndi.fscontext.RefFSContextFactroy”);  
  4. //设置文件系统路径(注意,开发者需要依据自身的机器修改”file:d://eclipse”)  
  5. Env.put(Context.PROVIDER_URL,”file:d://eclipse”);  
  6.   
  7. Context initCtx = null;  
  8. Try{  
  9.     //获得初始化上下文  
  10.     initCtx = new initialContext(env);  
  11.       
  12.     //借助于JNDI,查找文件  
  13.     Object fc =initCtx.lookup(“eclipse.ini”);  
  14.     Log.info(fc);  
  15. }  
  16. Catch(NamingException ne){  
  17. //处理命名异常  
  18. Log.error(“NamingException”,ne);  
  19. }  
  20. Finally{  
  21.     Try{  
  22.         //关闭上下文  
  23.         initCtx.close();  
  24. }catch(NamingException ne){;}  
  25. }  

上述代码先构造env,然后传给InitialContext.此时,”file:d://eclipse”成了JNDI树的根,eclipse目 录下的所有文件和目录都成为了树的成员。在查找到eclipse.ini后,需要关闭相应的InitialContext。整个过程需要处理 NamingException异常。
用户可以将应用对象存储在命名和目录服务提供者中,并供JNDI应用访问。比如,开发者可以将数据源存储在命名和目录服务器中;通过JNDI能够获得JTA事务管理其(存储在JavaEE 应用服务器提供的命名和目录服务器中)。
实例仅仅展示了JNDI的冰山一角。在实际企业应用中,JNDI的使用更多地发生于Web,EJB,Ear应用场合。比如,在JSF受管组件中访 问EJB3.0组件,借助于JNDI访问JMS Topic及ConnectionFactory。在这些场合中,JNDI的使用非常复杂。如果直接通过JNDI API操控目标资源,开发者要处理很多与实际业务无关的开发内容,具体如下:第一,要负责InitialContext的创建、关闭工作;第二,要负责异 常处理;第三,要考虑JNDI树上查找目标资源的实际;第四,查找到目标资源后,开发者还要考虑缓存策略(运行时是否需要重新去JNDI树上获取资源,否 则他会持有过期资源);第五,要区别对待开发时和生产环境的JNDI处理。考虑到这些对开发者的不利因素,Spring对JNDI提供了全方位的支持,这 也是Spring驱动敏捷开发的又一举措。
通过将JNDI查找操作定义在Spring配置文件中,应用能够操作到相关的JNDI对象,开发者再也不用对JNDI进行硬编码。最为重要的一 点是,应用对这些JNDI对象的依赖都是通过IoC容器注入的,因此开发者不用关注具体对象是从哪里来。甚至,Spring2.0对于Java EE资源(包括JNDI)的配置做了许多简化工作,比如引入<jee:jndi-lookup/>内容模式。

 

Android 微信支付快速集成案例及有效解决返回值-1

商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。本文讲解Android微信支付...
  • qq_29443203
  • qq_29443203
  • 2017年02月25日 11:10
  • 170

集成产品开发-1

昨天跟老同学聊天时,聊到了创业、以后的职业发展方向等
  • caoli98033
  • caoli98033
  • 2014年10月30日 10:31
  • 607

Jenkins+Docker搭建持续集成测试环境

Jenkins+Docker搭建持续集成测试环境 本文将重点讨论在Jenkins管理的持续集成以及测试的环境中,我们如何通过引入Docker来优化资源的配置,提高整个环境的性能以及稳...
  • chenglinhust
  • chenglinhust
  • 2016年06月28日 11:59
  • 5542

微服务实战:从架构到发布1

微服务实战:从架构到发布1 微服务实战:从架构到发布2 引言:“微服务”是当前软件架构领域非常热门的词汇,能找到很多关于微服务的定义、准则,以及如何从微服务中获益的文章,在企业的实践中去应用“微...
  • jeikerxiao
  • jeikerxiao
  • 2017年02月15日 08:41
  • 283

如何集成CKFinder(1)

在web应用中集成CKFinder的方法基本有两种,一种是利用Javasciprt, 二是结合开发语言特性。这里介绍在jsp环境下的后一种的集成方法。 1. 在官网下载CKFinder for Jav...
  • czp1001
  • czp1001
  • 2013年09月20日 01:35
  • 1412

kafka+storm集成并运行demo-单机

1,安装环境jdk1.7,kafka_2.9.2-0.8.1.1.tgz ,zookeeper-3.3.6.tar.gz,apache-storm-0.9.2-incubating.tar.gz 2,...
  • linux_ja
  • linux_ja
  • 2014年12月13日 22:12
  • 3563

iOS环信集成<1>

今天周末,想着没事就写写代码,因为基础底子比较弱,所以联系加了4个月班学习,总之现在已经养成每天学习新的知识的习惯。大学拿了三年奖学金出来转iOS,真的是隔行如隔山,有些事不是努力就一定成长,但是不努...
  • mr_liu_easy_ios
  • mr_liu_easy_ios
  • 2016年04月24日 23:23
  • 595

android 百度地图集成(1)

写个自己; 忙碌、休息、懒散、迷糊 的过了差不多两个多月。 在两个月经历的项目中开始初步的使用了解了百度地图sdk的集成。。。  回头看看,从最早集成极光推送,踩足了坑,历经一个星期才推送成功~~~原...
  • u012143945
  • u012143945
  • 2016年09月13日 10:09
  • 127

持续集成调研报告(1)

持续集成(CI)调研报告 一.       持续集成的价值 1.      持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量。 2.      持...
  • laoqi007
  • laoqi007
  • 2014年02月24日 12:04
  • 397

集成学习(1)--Matlab/Python

集成学习理论 Matlab代码分析 Python代码分析 ================================================= 集成学习(ensemble lear...
  • ifruoxi
  • ifruoxi
  • 2016年12月09日 11:06
  • 1341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: Spring2.0JNDI集成(1)
举报原因:
原因补充:

(最多只允许输入30个字)