EJB分布式对象实现方式描述
在Java RMI中要求所有的参数传递和返回类型是JAVA的基本类型或实现Serilizable的对象。
串行化对象通过值传递(又名拷贝传递),而不是引用传递。
这意味着在某一层中串行化对象的更新并不自动影响到其它的对象。
对于EJB对象而言,它由两个接口(home接口和remote接口)和一个类组成。
容器会根据ejb规范来生成上面两个接口的类(我们分别称为xxxEJBHome对象和xxxEjbObject对象)。
在较多的容器实现方案中,xxxEJBHome对象使用了factory模式来创建xxxEjbObject对象;
xxxEjbObject对象则采用proxy模式作为xxxBean的代理类。
在生成以上两个对象的同时,容器会从部署文件中读取关于安全、事务、持久性等服务并在xxxEjbObject对象和xxxEJBHome对象中添加以上服务的代码。
而且xxxEJBHome对象和xxxEjbObject对象都是分布式对象。
在此我们只讨论xxxEjbObject对象。
所谓分布式对象,从本质上讲,分为三个部分:object server,skeleton,stub。
其中object server和skeleton位于服务器端,而stub位于客户端。
Object server负责实现业务逻辑,skeleton负责marshal和unmarshal方法签名。
显然,EJB的客户(调用EJB的对象)可以是任何对象,包括EJB和一般的Java类甚至是用任何语言写的corba客户端。
从EJB的客户视角来看的话,我们只能看到一个home接口、一个remote接口(对于实体bean的话,还可以看见一个主键类,而bean类对客户是不可见的)。
但。。。对于remote接口中的方法调用实际上是多态的调用XXX_Stub类,即XXX_Stub对象对客户具有可见性(但这种可见性是透明的,即客户不知道这种可见性的存在)。
由于XXX_Stub对象和Object Server实现了相同的接口,并且Object server真正实现了业务逻辑。
所以,当在客户端调用XXX_Stub对象的方法时候,XXX_Stub对象通过socket通信机制将方法签名传给XXX_Skeleton对象,XXX_Skeleton对象再去委托Object server完成业务处理逻辑。
因此,Object server本身发生了改变。
我们称XXX_Stub对象是Object Server对象的远程引用,并认为当分布式对象作为参数传递的时候,是通过引用传递的(会产生副作用,即改变参数对象),只不过这种引用是远程引用。
来源:
http://wenku.baidu.com/view/942bb1ec0975f46527d3e1ba.html