深入掌握Java技术EJB调用原理分析一

一个远程对象至少要包括4个class文件:远程对象;远程对象的接口;实现远程接口的对象的stub;对象的skeleton这4个class文件。

在EJB中则至少要包括10个class:

Bean类,特定App Server的Bean实现类,Bean的remote接口,特定App Server的remote接口实现类,特定App Server的remote接口的实现类的stub类和skeleton类。

Bean的home接口,特定App Server的home接口实现类,特定App Server的home接口的实现类的stub类和skeleton类和RMI不同的是,EJB中这10个class真正需要用户编写的只有3个,分别是Bean类和它的remote接口,home接口,至于其它的7个class到底是怎么生成,被打包在什么地方,或者是否需要更多的类文件,会根据不同的App Server表现出比较大的差异,不能一概而论。

拿我最熟悉的Weblogic的来说吧,Weblogic的Bean实现类,以及两个接口的Weblogic的实现类是在ejbc的时候被打包到EJB的jar包里面的,这3个class文件可以看到。而home接口和remote接口的Weblogic的实现类的stub类和skeleton类是在EJB被部署到Weblogic的时候,由Weblogic动态生成stub类和Skeleton类的字节码,因此看不到这4个类文件。

对于一次客户端远程调用EJB,要经过两个远程对象的多次RMI循环。首先是通过JNDI查找Home接口,获得Home接口的实现类,这个过程其实相当复杂。

首先是找到Home接口的Weblogic实现类,然后创建一个Home接口的Weblogic实现类的stub类的对象实例,将它序列化传送给客户端(注意stub类的实例是在第1次RMI循环中,由服务器动态发送给客户端的,因此不需要客户端保存Home接口的Weblogic实现类的stub类),最后客户端获得该stub类的对象实例(普通的RMI需要在客户端保存stub类,而EJB不需要,因为服务器会把stub类的对象实例发送给客户端)。

客户端拿到服务器给它的Home接口的Weblogic实现类的stub类对象实例以后,调用stub类的create方法,(在代码上就是home.create(),但是后台要做很多事情),于是经过第2次RMI循环,在服务器端,Home接口的Weblogic实现类的skeleton类收到stub类的调用信息后,由它再去调用Home接口的Weblogic实现类的create方法。

在服务端,Home接口的Weblogic实现类的create方法再去调用Bean类的Weblogic实现类的ejbCreate方法,在服务端创建或者分配一个EJB实例,然后将这个EJB实例的远程接口的Weblogic实现类的stub类对象实例序列化发送给客户端。

客户端收到remote接口的Weblogic实现类的stub类的对象实例,对该对象实例的方法调用(在客户端代码中实际上就是对remote接口的调用),将传送给服务器端remote接口的Weblogic实现类的skeleton类对象,而skeleton类对象再调用相应的remote接口的Weblogic实现类,然后remote接口的Weblogic实现类再去调用Bean类的Weblogic实现类,如此就完成一次EJB对象的远程调用。

看了一遍帖子,感觉还是没有说太清楚,既然写了帖子,就想彻底把它说清楚。

先拿普通RMI来说,有4个class,分别是远程对象,对象的接口,对象的stub类和skeleton类。而对象本身和对象的stub类同时都实现了接口类。而我们在客户端代码调用远程对象的时候,虽然在代码中操纵接口,实质上是在操纵stub类,例如:

接口类:Hello

远程对象:Hello_Server

stub类:Hello_Stub

skeleton类:Hello_Skeleton

客户端代码要这样写:

Hello h = new Hello_Stub();

h.getString();

我们不会这样写:

Hello_Stub h = new Hello_Stub();

h.getString();

因为使用接口适用性更广,就算更换了接口实现类,也不需要更改代码。因此客户端需要Hello.class和Hello_Stub.class这两个文件。

但是对于EJB来说,就不需要Hello_Stub.class,因为服务器会发送给它,但是Hello.class文件客户端是省不了的,必须有。表面上我们的客户端代码在操纵Hello,但别忘记了Hello只是一个接口,抽象的,实质上是在操纵Hello_Stub。

拿Weblogic上的EJB举例子,10个class分别是:

Bean类:HelloBean (用户编写)

Bean类的Weblogic实现类:HelloBean_Impl (EJBC生成)

Home接口:HelloHome (用户编写)

Home接口的Weblogic实现类 ((Hello Bean))_HomeImpl(EJBC生成)

时间: 2024-09-17 13:15:10

深入掌握Java技术EJB调用原理分析一的相关文章

深入掌握Java技术EJB调用原理分析二

Home接口的Weblogic实现类的stub类 ((Hello Bean))_HomeImpl_WLStub(部署的时候动态生成字节码) Home接口的Weblogic实现类的skeleton类 ((Hello Bean))_HomeImpl_WLSkeleton(部署的时候动态生成字节码) Remote接口:Hello (用户编写) Remote接口的Weblogic实现类 ((Hello Bean))_EOImpl(EJBC生成) Remote接口的Weblogic实现类的stub类 ((

java中HashMap的原理分析_java

我们先来看这样的一道面试题: 在 HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型.放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key 从 HashMap 里取出元素,这时候 HashMap 会返回什么? 文中已给出示例代码与答案,但关于HashMap的原理没有做出解释. 1. 特性 我们可以用任何类作为HashMap的key,但是对于这些类应该有什么限制条件呢?且看下面的代码: public class Person { priva

Java阻塞队列实现原理分析

Java中的阻塞队列接口BlockingQueue继承自Queue接口. BlockingQueue接口提供了3个添加元素方法: add:添加元素到队列里,添加成功返回true,由于容量满了添加失败会抛出IllegalStateException异常; offer:添加元素到队列里,添加成功返回true,添加失败返回false; put:添加元素到队列里,如果容量满了会阻塞直到容量不满. 3个删除方法: poll:删除队列头部元素,如果队列为空,返回null.否则返回元素; remove:基于对

Java 框架 Netty 实现原理分析

文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研 究.如果下面的内容有错误或不严谨的地方,也请指正和谅解.对于Netty使用者来说,Netty提供了几个典型的example,并有详尽的API doc和guide doc,本文的一些内容及图示也来自于Netty的文档,特此致谢. 1.总体结构 先放上一张漂亮的Netty总体结构图,下面的内容也主要围绕该图上的一些核心功能做分析,但对如Container Integration及Security Support等高

Java中的ConcurrentHashMap原理分析节选

集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区Queue,比如常会用缓存作为外部文件的副本HashMap.这篇文章主要分析jdk1.5的3种并发集合类型concurrent,copyonright,queue中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅.      在tiger之前我们使用得最多的数据结构之一就是HashMap和Hashtable.大HashMa

Java实现单向双向链表原理分析

何为链表 链式结构是一种使用对象引用变量来创建对象间的链的数据结构. 对象引用变量可用于创建链式结构 对象引用变量所存储的特定地址一般无关紧要.换句话说,重要的是能够使用引用变量来访问对象,而对象在内存中的特定存储位置并不重要.因此,我们一般将引用变量描述为一个"指向"对象的名称,而不是显示其地址,按照这种理解,引用变量有时称为"指针" 一个指向对象的对象引用变量 下面的这个类就是一个链式结构: 123456 public class Person { privat

jquery lazyload延迟加载技术的实现原理分析_jquery

前言 懒加载技术(简称lazyload)并不是新技术,它是js程序员对网页性能优化的一种方案.lazyload的核心是按需加载.在大型网站中都有lazyload的身影,例如谷歌的图片搜索页,迅雷首页,淘宝网,QQ空间等.因此掌握lazyload技术是个不错的选择,可惜jquery插件lazy load官网(http://www.appelsiini.net/projects/lazyload)称不支持新版浏览器. lazyload在什么场合中应用比较合适? 涉及到图片,falsh资源,ifram

robbin写的EJB调用的原理分析

一个远程对象至少要包括4个class文件:远程对象:远程对象的接口:实现远程接口的对象的stub:对象的skeleton这4个class文件. 在EJB中则至少要包括10个class: Bean类,特定App Server的Bean实现类 Bean的remote接口,特定App Server的remote接口实现类,特定App Server的remote接口的实现类的stub类和skeleton类 Bean的home接口,特定App Server的home接口实现类,特定App Server的h

Ajax技术组成与核心原理分析_AJAX相关

本文主要为大家分析了Ajax技术组成原理,供大家参考,具体内容如下 1.Ajax特点:局部刷新.提高用户的体验度,数据从服务器商加载  2.AJax的技术组成不是新技术,而是之前技术的整合 Ajax: Asynchronous Javascript And Xml;(异步的JavaScript和XML) 包括的技术:JavaScript.XML.CSS.XMLHttpRequest 异步:发送请求以后,不等结果,由回调函数处理. JavaScript:向服务器发送请求,获得返回结果,更新页面 X