|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流.一个远程对象最少要包含4个class文件:远程对象;远程对象的接口;完成远程接口的对象的stub;对象的skeleton这4个class文件。在EJB中则最少要包含10个class:Bean类,特定AppServer的Bean完成类Bean的remote接口,特定AppServer的remote接话柄现类,特定AppServer的remote接口的完成类的stub类和skeleton类Bean的home接口,特定AppServer的home接话柄现类,特定AppServer的home接口的完成类的stub类和skeleton类和RMI分歧的是,EJB中这10个class真正必要用户编写的只要3个,分离是Bean类和它的remote接口,home接口,至于别的的7个class究竟是怎样天生,被打包在甚么中央,大概是不是必要更多的类文件,会依据分歧的AppServer体现出对照年夜的差别,不克不及混为一谈。拿我最熟习的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_Serverstub类:Hello_Stubskeleton类:Hello_Skeleton客户端代码要如许写:Helloh=newHello_Stub();h.getString();我们不会这些写:Hello_Stubh=newHello_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完成类HelloBean_HomeImpl(EJBC天生)Home接口的Weblogic完成类的stub类HelloBean_HomeImpl_WLStub(部署的时分静态天生字节码)Home接口的Weblogic完成类的skeleton类HelloBean_HomeImpl_WLSkeleton(部署的时分静态天生字节码)Remote接口:Hello(用户编写)Remote接口的Weblogic完成类HelloBean_EOImpl(EJBC天生)Remote接口的Weblogic完成类的stub类HelloBean_EOImpl_WLStub(部署的时分静态天生字节码)Remote接口的Weblogic完成类的skeleton类HelloBean_EOImpl_WLSkeleton(部署的时分静态天生字节码)客户端只必要Hello.class和HelloHome.class这两个文件。HelloHomehome=(Home)PortableRemoteObject.narrow(ctx.lookup("Hello"),HelloHome.class);这一行代码是从JNDI取得Home接口,可是请记着!接口是笼统的,那末home这个对象究竟是甚么类的对象实例呢?很复杂,用toString()输入看一下就分明了,上面一行是输入了局:HelloBean_HomeImpl_WLStub@18c458这标明home这个经由过程从服务器的JNDI树上查找取得的对象实践上是HelloBean_HomeImpl_WLStub类的一个实例。接上去客户端代码:Helloh=home.create()一样Hello只是一个笼统的接口,那末h对象是甚么工具呢?打印一下:HelloBean_EOImpl_WLStub@8fa0d1本来是HelloBean_EOImpl_WLStub的一个对象实例。用这个例子来简述一遍EJB挪用历程:起首客户端JNDI查询,服务端JNDI树上Hello这个名字实践上绑定的对象是HelloBean_HomeImpl_WLStub,以是服务端将创立HelloBean_HomeImpl_WLStub的一个对象实例,序列化前往给客户端。因而客户端失掉home对象,外表上是失掉HelloHome接口的实例,实践上是举行了一次远程挪用失掉了HelloBean_HomeImpl_WLStub类的对象实例,别健忘了HelloBean_HomeImpl_WLStub也完成了HelloHome接口。然后home.create()本色上就是HelloBean_HomeImpl_WLStub.create(),该办法将发送信息给HelloBean_HomeImpl_WLSkeleton,而HelloBean_HomeImpl_WLSkeleton承受到信息后,再往挪用HelloBean_HomeImpl的create办法,至此完成第1次完全的RMI轮回。注重在此次RMI轮回过程当中,远程对象是HelloBean_HomeImpl,远程对象的接口是HelloHome,对象的stub是HelloBean_HomeImpl_WLStub,对象的skeleton是HelloBean_HomeImpl_WLSkeleton。然后HelloBean_HomeImpl再往挪用HelloBean_Impl的ejbCreate办法,而HelloBean_Impl的ejbCreate办法将卖力创立大概分派一个Bean实例,而且创立一个HelloBean_EOImpl_WLStub的对象实例。这一步对照风趣的是,在前一步RMI轮回中,远程对象HelloBean_HomeImpl在客户端有一个代办署理类HelloBean_HomeImpl_WLStub,但在这一步,HelloBean_HomeImpl本人却充任了HelloBean_Impl的代办署理类,只不外HelloBean_HomeImpl不在客户端,而是在服务端,因而不举行RMI。然后HelloBean_EOImpl_WLStub的对象实例序列化前往给客户端,这一步也很风趣,前次RMI历程,配角是HelloBean_HomeImpl和它的代办署理类HelloBean_HomeImpl_WLStub,但这这一次换成了HelloBean_EOImpl和它的代办署理类HelloBean_EOImpl_WLStub来玩了。Helloh=home.create();h.helloWorld();假定Hello接口有一个helloWorld远程办法,那末外表上是在挪用Hello接口的helloWorld办法,实践上是在挪用HelloBean_EOImpl_WLStub的helloWorld办法。然后HelloBean_EOImpl_WLStub的helloWorld办法将发送信息给服务器上的HelloBean_EOImpl_WLSkeleton,而HelloBean_EOImpl_WLSkeleton收到信息今后,再往挪用HelloBean_EOImpl的helloWorld办法。至此,完成第2次完全的RMI轮回历程。在方才HelloBean_EOImpl是作为远程对象被挪用的,它的代办署理类是HelloBean_EOImpl_WLStub,但如今HelloBean_EOImpl要作为HelloBean_Impl的代办署理类了。如今HelloBean_EOImpl往挪用HelloBean_Impl的helloWorld办法。注重!HelloBean_Impl承继了HelloBean,而HelloBean中的helloWorld办法是我们亲身编写的代码,如今终究挪用到了我们编写的代码了!至此,一次EJB挪用历程终究完成。在全部过程当中,服务端次要要挪用的类是HelloBean_Impl,HelloBean_HomeImpl,HelloBean_HomeImpl_WLSkeleton,HelloBean_EOImpl,HelloBean_EOImpl_WLSkeleton。客户端次要挪用的类是HelloBean_HomeImpl_WLStub,HelloBean_EOImpl_WLStub,这两个类在客户端代码中其实不会间接呈现,呈现在代码中的类是他们的接口HelloHome和Hello,因而客户端必要这两个接口文件,而Stub是服务器传送给他们的。
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流. |
|