jndi(是什么)和ejb容器的关系

article/2025/10/26 8:41:29
如下: 转载了几篇关于ejb jndi的文章! 转载: http://blog.csdn.net/zhaosg198312/article/details/3979435 JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。 JNDI的扩展: JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。 所以,在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。 …… 2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。 JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。 在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。 可以简单的把JNDI理解为一种将对象和名字绑定的技术,JBoss容器负责生产出对象,这些对象都有唯一的名字绑定,外部程序可以通过名字来获得对象的引用。所以换句话说,JNDI是Sun公司提供的一种标准的Java命名系统接口。






JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。
那么,JNDI到底起什么作用?

要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。

没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。
就像以下代码这样:
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver",
true, Thread.currentThread().getContextClassLoader());
conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
/* 使用conn并进行SQL操作 */
......
conn.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) {}
}
}

这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。

没有JNDI的做法存在的问题:
1、数据库服务器名称 MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;
4、……

解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

由此,就有了JNDI。

用了JNDI之后的做法:
首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
具体操作如下(以JBoss为例):
1、配置数据源
在JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。
修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:
<?xml version=”1.0” encoding=”UTF-8”?>
<datasources>
<local-tx-datasource>
    <jndi-name> MySqlDS</jndi-name>
    <connection-url> jdbc:mysql://localhost:3306/lw</connection-url>
    <driver-class> com.mysql.jdbc.Driver</driver-class>
    <user-name> root</user-name>
    <password> rootpassword</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping> mySQL</type-mapping>
    </metadata>
</local-tx-datasource>
</datasources>

这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。

2、在程序中引用数据源:
Connection conn=null;
try {
Context ctx=new InitialContext();
Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源
DataSource ds=(Datasource)datasourceRef;
conn=ds.getConnection();
/* 使用conn进行数据库SQL操作 */
......
c.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) { }
}
}
直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。
在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。

由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

JNDI的扩展:
JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。

所以,在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。

EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中,这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理,从 EJB 组件到 JMS 队列和主题,再到简单配置字符串或其他对象,这可以降低随时间的推移服务变更所产生的维护成本,同时还可以简化部署,减少集成工作。 外部资源”。


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

在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。





转载: http://blog.csdn.net/gaoying_blogs/article/details/41515743

    EJB是Enterprice Java Beans的简称,即企业Java组件,是一个用于分布式业务应用标准服务端组件模型(这里强调是服务端组件模型,后面我们将会说一下为什么是服务端而不是客户端),是一组用java语言编写的包含字段和方法的代码体,而这些代码的核心任务就是实现纯粹的业务逻辑。


    采用Enterprice java Beans架构编写的应用是可伸的、事务性的、多用户安全的,可以一次编写这些应用,然后部署在任何支持Enterprice Java Beans规范的服务器平台,如JBoss、Weblogic等。


    容器知多少?EJB容器呢?

    EJB要在EJB容器中运行,运行时环境由容器建立,当完成EJB的开发后,需要将EJB组件部署到EJB容器中,只有正确部署后,EJB容器才能向客户提供业务服务。在这里想说一下容器,我们可以这么理解容器,容器只是一种概念,容器可以管理对象的生命周期,对象与对象之间的依赖关系。可以使用配置文件(通常是xml)然后定义好对象的名称、如何产生等,在启动容器之后,所有的对象都可以直接被取用(如果不用容器就需要编写一段相应的代码来产生对象或建立与对象之间的依赖关系等)。也就是原来不用容器前,都是需要自行编写程序以管理对象;应用了容器之后都会自动帮忙做好,就节省了再编写程序管理对象的环节。常用的容器有WebLogic、Tomcat等


    在EJB中,JBoss是一个开源的J2EE应用服务器,可以在该容器下部署和运行EJB组件。每个J2EE应用服务器都包含EJB容器和Web容器,所以既可以运行EJB,也可以运行Web应用(而Tomcat目前只是Web容器,它不能运行EJB应用)。早期的JBoss版本只包含EJB容器,而不包含Servlet容器,因此需要把JBoss与Tomcat集成,二者协同工作,才能构成完整的JEE应用服务器。新版本的JBoss同时提供了Servlet容器和EJB容器,因此既能运行JavaWeb应用,又能运行EJB组件。


    EJB的分类

    EJB定义了三种企业Bean,分别是Session Bean(会话Bean)、Entity Bean(实体Bean)、MessageDriven Bean(消息驱动Bean),下面我们就来一一认识一下这三种Bean.


    1、首先Session Bean

    Session Bean实现会话中的业务逻辑。它分为有状态Bean和无状态Bean,每当客户端发出EJB调用请求时,容器就会选择一个Session Bean来为客户端服务,Session Bean可以直接访问数据库,但更多的时候,它是通过Entity Bean实现数据访问。


    2、其次Entity Bean

    Entity Bean实现一个业务实体。Entity Bean代表真实物体的数据,在EJB3.0中(后面我们会专门拿出一篇文章来介绍EJB3.0),Entity Bean仅作为普通的Java对象来使用,它负责跟数据库表进行对象与关系映射(O/R Mapping)


    3、最后MessageDriven Bean
    MessageDriven Bean作为JMS(Java Message Service)Java消息服务的API的监听者,异步处理其中的消息。MessageDriven Bean是用来专门处理基础消息请求的组件,能够轻松的与其他EJB交互。它特别适合用于当一个业务执行的时间很长,而执行结果无需实时向用户反馈的这样一种场合。


    介绍完基本的EJB方面的知识,下面我想说一下JNDI。其实上网查找了好多关于EJB方面的资料,很多资料很顺便的介绍JNDI,弄的我也是云里雾里,所以很有必要把JNDI好好扒一扒,限于篇幅的原因,下篇文章,我们就来好好扒一扒何为JNDI,敬请期待!有什么困惑有什么不足的地方,非常欢迎您在下方留言,和我沟通,谢谢!


转载: http://blog.csdn.net/gaoying_blogs/article/details/41516525

   上篇文章我们宏观的介绍了一下何为EJB,在上篇文章的结尾我为大家埋下了一个伏笔,就是何为JDNI呢?在很多关于EJB的资料中介绍了JNDI,但是弄得我也是云里雾里的,所以我们借着今天这篇文章,就来好好扒一扒什么是JNDI。


    JNDI知多少?

    EJB对象由容器(JBoss)提供,因此不能在程序中使用创建实例的方法来生成EJB对象,而需要采用Java的JNDI(Java Naming and Directory Interface),即Java的命名和目录接口来获得EJB对象的引用。可以简单的把JNDI理解为一种将对象和名字绑定的技术,JBoss容器负责生产出对象,这些对象都有唯一的名字绑定,外部程序可以通过名字来获得对象的引用。所以换句话说,JNDI是Sun公司提供的一种标准的Java命名系统接口。


    

    在结构上,JNDI由两部分组成:即API和SPI(Service Provider Intergace,服务提供商接口)。JNDI提供统一的客户端API,应用程序通过客户API访问命名和目录服务(目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性);服务提供商接口SPI用于供厂商创建命名和目录服务的JNDI实现。


    JNDI的架构和JDBC的架构非常类似,所以网上有一系列关于JNDI和JDBC区别的文章,有兴趣的可以自己去查阅。


    对于EJB开发者来说,我们只需要知道使用客户API如何访问命名和目录服务即可,而不需要知道SPI的使用,因为我们不需要使用SPI开发JNDI实现产品。就好比我们通过JDBC访问数据库,我们只需要知道使用JDBC API如何访问数据库,而不需要知道数据库的JDBC驱动如何实现,只知道我们要实现的就可以了,而不需要了解内部的处理调用流程、原理。


    J2EE规范要求所有的J2EE容器都要提供JNDI规范的实现,JNDI在J2EE中的角色就是“交互机”,就是J2EE组件在运行时间间接的查找其他组件、资源或服务的通用机制,也就是说JNDI在J2EE应用程序中提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。这样就暗合了上段中我们所提到的,对于EJB开发者而言只需要知道使用客户API如何访问命名和目录服务即可,而不需要知道SPI的使用。


    好了,JNDI的介绍就这么多,如果您有更好的想法欢迎您在下方留言,谢谢!


http://chatgpt.dhexx.cn/article/hAnH9nt0.shtml

相关文章

EJB是什么?

来源&#xff1a;http://blog.csdn.net/jojo52013145/article/details/5783677 1. 我们不禁要问&#xff0c;什么是"服务集群"&#xff1f;什么是"企业级开发"&#xff1f; 既然说了EJB 是为了"服务集群"和"企业级开发"&#xff0c;那…

EJB到底是什么

百科定义EJB&#xff1a; 被称为java企业bean&#xff0c;服务器端组件&#xff0c;核心应用是部署分布式应用程序。用它部署的系统不限定平台。实际上ejb是一种产品&#xff0c;描述了应用组件要解决的标准 标准&#xff1a; 可扩展 (Scalable)分布式 (Distributed)事务处理(T…

EJB是什么,以及weblogic和tomcat的区别

首先说一下weblogic和tomcat的区别 weblogic是 java应用服务器 用于开发、集成、部署和管理大型分布式web应用、网络应用和数据库应用 将java的动态功能和java enterprise标准的安全性引入大型网络应用的开发集成部署和管理之中。 weblogic中有domain &#xff0c;域是作为一…

到底EJB是什么

到底EJB是什么&#xff1f;被口口相传的神神秘秘的&#xff0c;百度一番&#xff0c;总觉得没有讲清楚的&#xff0c;仍觉得一头雾水。百度了很久&#xff0c;也从网络的文章的只言片语中&#xff0c;渐渐有了头绪。 用通俗话说&#xff0c;EJB就是&#xff1a;"把你编写的…

EJB是什么

1. 我们不禁要问&#xff0c;什么是"服务集群"&#xff1f;什么是"企业级开发"&#xff1f; 既然说了EJB 是为了"服务集群"和"企业级开发"&#xff0c;那么&#xff0c;总得说说什么是所谓的"服务 集群"和"企业级开发…

EJB到底是什么,真的那么神秘吗?

百科定义EJB&#xff1a; 被称为java企业bean&#xff0c;服务器端组件&#xff0c;核心应用是部署分布式应用程序。用它部署的系统不限定平台。实际上ejb是一种产品&#xff0c;描述了应用组件要解决的标准 标准&#xff1a; 可扩展 (Scalable)分布式 (Distributed)事务处理(T…

程序无法正常启动(0xc000007b) 解决的过程

版权声明&#xff1a;转载需标明该文链接。 https://blog.csdn.net/zaibeijixing/article/details/87785073 解决&#xff08;2019/2/20&#xff09; 之前基于opencv 的项目都完全没问题&#xff0c;现在新建的一个opencv程序出现上述错误。查阅网上资料&#xff0c;自己摸索&a…

“0xc000007b无法正常启动”我的解决方案

关于这个问题&#xff0c;网上有很多解决方案&#xff0c;但是你得找到自己的问题在哪。 有的说DirectX 9.0损坏&#xff0c;我试着恢复了一下&#xff0c;还是没有得到解决。 还是DLL的问题&#xff0c;可能是缺少或者32位和64位使用不合适。 我的问题最开始不是这个&#xf…

应用程序无法正常启动0xc000007b怎么解决

我们平时在使用电脑时&#xff0c;打开应用或者安装某些软件例如MySQL&#xff08;博主本人就是在安装MySQL时遇见的&#xff09;&#xff0c;有时候会出现提示“应用程序无法正常启动0xc000007b”&#xff0c;这个问题的原因是什么呢&#xff1f;博主本人去简单了解了一下&…

计算机无法启动应用程序怎么办,应用程序0xc000007b无法正常启动解决办法

最近经常有有用户在电脑系统上操作运行程序时就出错了&#xff0c;且遇到提示“应用程序无法正常启动(0xc000007b)”。这该怎么办呢&#xff1f;接下来&#xff0c;小编就向大家介绍应用程序无法正常启动提示错误0xc000007b的原因和解决方法。 出现“应用程序无法正常启动0xc00…

aapt 命令可应用于查看apk包名、主activity、版本等很多信息

aapt命令小结 互相学习&#xff0c;请关注我的微博&#xff1a;weibo.com/ganchaojiang aapt即Android Asset Packaging Tool.本文小结了一下该工具的用法。 1. aapt l[ist] [-v] [-a] file.{zip,jar,apk} List contents of Zip-compatible archive. 1.1 列出压缩文件目录…

Android:linux下aapt使用

Android&#xff1a;linux下aapt使用 aapt stands for Android Asset Packaging Tool and is included in the tools/ directory of the SDK. This tool allows you to view, create, and update Zip-compatible archives (zip, jar, apk). It can also compile resources into…

【Android自动化打包】01. aapt的用法

什么是aapt&#xff1f; 执行命令&#xff1a; C:\Users\Xiaopeng>aapt Android Asset Packaging Tool 1. 列出apk包的内容 aapt l[ist] [-v] [-a] file.{zip,jar,apk} 注&#xff1a;filepath是apk存放的路径 1.1 aapt l -v filepath/..apk  &#xff1a;以table的形式…

linux下载安装aapt工具

我也上传了资源 aaptapktoolapktool.jar-Android文档类资源-CSDN下载aaptapktoolapktool.jar更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_25815655/85195493 这里把需要的包下下来传csdn了。如果命令无法下载可参考csdn下载地址&#xf…

Android AAPT详解

目录 AAPT解释&#xff0c;作用AAPT基本命令AAPT编译资源源码解析AAPT打包和系统不一致的资源ID AAPT是什么 AAPT - Android Asset Packaging Tool 看全称&#xff0c;就可知道AAPT是Android资源打包工具。&#xfffd;讲这个之前&#xff0c;是有必要简单说下Android是如何构…

41.Android aapt工具

41.Android aapt工具 Android aapt工具 aapt 介绍aapt 环境配置aapt listaapt dumpaapt package其他命令 aapt 介绍 可参考官方文档&#xff1a; http://www.androidcn.net/wiki/index.php/Reference/aapt aapt stands for Android Asset Packaging Tool and is included in …

[Android]aapt使用小结

aapt命令小结 aapt即Android Asset Packaging Tool.本文小结了一下该工具的用法。 1. aapt l[ist] [-v] [-a] file.{zip,jar,apk} List contents of Zip-compatible archive. 1.1 列出压缩文件目录 aapt l <file_path.apk> 参数: -v:会以table的形式输出目录,ta…

[aapt包管理]aapt查询Apk最低支持的Android版本

向电视盒子中安装DSvideo_TV.apk时&#xff0c;报盒子版本过低(16年的盒子比较老旧了)&#xff0c;因此想查一下DSvideo_TV.apk支持的最低Android版本&#xff0c;从而针对性的进行盒子更新。 1、如何获取APK支持的最低Android版本&#xff1f; 第一时间想到的是Android SDK提…

Android中aapt使用详解

aapt是Android sdk中提供的一个小工具&#xff0c;功能十分强大。appt&#xff1a;Android Asset Packaging Tool &#xff0c;在sdk的build-tools下&#xff0c;这个工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件。我们可能没有…

aapt命令详解

aapt是android自动打包工具之一。 环境配置&#xff1a; aapt一般在android sdk的build-tools中对应文件夹里面&#xff0c;将其路径添加到环境变量中&#xff0c;即可在命令行中直接使用aapt命令&#xff1b; aapt参数详解 aapt 命令后可直接查看参数详解 aapt l[ist] [-v…