EJB学习笔记(2)

     本来这篇日志应该早就写了,但由于近期工作上的问题才拖了这么久,另外sourceforge.net竟然tmd被电信给封了,导致我jboss也下不了,好在公司有自己的dns服务器,公司还能下。
     第二篇学习笔记主要是针对《Mastering EJB 3rd》的第二和第三章。第二章主要介绍ejb开发的几个组成部分,第三张则是ejb的hello world。
     这里主要是在理一下思路,重新阐述一下ejb开发的几个组成部分。首当其冲当然是Enterprise Bean第一章所讲到的SOA正是通过Enterprise Bean来表现的。Enterprise Bean一共有三种,Entity Bean,Session Bean和Message Driven Bean。Entity Bean就我目前的理解相当于O/R Mapping中将某张关系表映射成某个对象这样的一个概念。但是记住SOA所以Entity Bean表示的是更为抽象的概念,他其实是将业务逻辑中的某个实体映射成一个对象。所以称作Entity Bean。举个例子图书馆关系系统中书就是一个实体,所以可以构造一个Entity Bean来描述书这个概念。Session Bean是对某个业务流程的操作过程。再拿图书馆系统举例,注册书,移走书,将书和这本书目前的所有者绑定,这些都是书的业务处理过程,把这些操作封装成一个个方法并进一步封装成一个类,那这个类就是Session Bean了,至于Message Bean资料上的概念是由消息驱动的业务处理过程,但是我对这个概念还不是很理解,将会在以后的学习笔记中详述。
       我们知道ejb的核心是rmi-iiop,因为enterprise bean可能不在本地,而要实现对enterprise bean的远程调用,就要利用rmi技术,这就引出了ejb object这个概念。ejb object是什么?简单来说,他是为了实现location transparent而产生的东西。什么是location transparent?即当你在调用远程对象的某个方法时,你并不知道这件事,或者说你觉得你这个对象就在本地。事实上,完全的地域透明性是不可能的,由于网络传输的不稳定和对远程状态的不了解(比如远程对象所在的机器突然当机了)必须要在方法里抛出RemoteException,这样方法签名就不可能完全相同。事实上对于远程ejb object来说,他所必须定义enterprise bean中的所有方法,但是和enterprise bean中的业务方法的唯一不同点就是ejb object的这些方法必须抛出RemoteException。同样,可能enterprise bean就在本地,所以ejb object对象也有可能是本地ejb对象,这样方法签名就和enterprise bean中的业务方法完全一致了。ejb object的实现一般由ejb容器完成(比如jboss),程序员可以不必理会。
      你可能认为这样的话客户端就直接和ejb object交互,通过远程调用,去执行真正的enterprise bean的方法。的确客户端是直接和ejb object去交互,但绝对不是自己去new 一个ejb object事实上,刚刚已经说过ejb object的实现类是由容器负责实现的,你也不可能去new。更为重要的是在之前的管理好你的对象的blog中已经说明了创建对象必须由专门的管理类去完成,那ejb的机制肯定更是这样,于是ejb 还提出了一个ejb home的概念,ejb home中提供了工厂方法来返回ejb object的具体实现类(当然对你而言你看到的仅仅是接口),同样ejb home也有remote 和local之分,remote也要抛出远程异常。
       总结一下,开发ejb时,核心是enterprise bean,里面会有业务的具体实现,为了实现地域透明性,所以要有ejb object,ejb object有remote和local之分。为了得到ejb object的引用需要有ejb home中的工厂方法来实现。所以还要有ejb home,也有remote和local之分。
       当你把这些都写完后,最后要做的就是写部署描述符文件ejb-jar.xml这个文件中描述了你要用到的enterprise bean,ejb object,ejb home等的相关信息,容器就是通过这些信息去管理ejb的整个流程的。
       完成部署描述符后,就可以部署ejb了,把上面写好的这些东西按照ejb specification中的目录结构放好后打成jar包放到特定容器规定的目录中,就可以把这个ejb服务起来了。
       注意,你只是起了ejb服务,还没有任何客户端!现在客户端唯一要做的是就是得到ejb home,在通过ejb home中的工厂方法得到ejb object然后调用业务方法。这里的问题是如何得到ejb home?通常情况下是用jndi,在容器中配置好相关ejb的jndi后,就可以在客户端代码中lookup ejb home了。
       本来想帖一段第三章的这几个模块的代码,但是想想这种例子往上多的是,我觉得最重要的还是enterprise bean,ejb object和ejb home这三个概念本身和他们的作用。学习这样的一种设计思想。不过事实上这样的设计其实已经暴露出了ejb过于复杂的缺点,如果没有分布式应用的话,这样做是毫无必要的,因为根本不存在地域透明性的问题了。曾经有个笑话,ejb很火的那个时候如果问许多企业的设计师哪些人用ejb肯能都会举手,但是一旦问哪些用到了分布式系统可能其中只有1,2个人会举手。所以,我个人认为软件是为了方便人使用,而不是人为了方便软件在做事情。如果整个系统没有分布式应用的话,轻型框架可能会更加适合。当然ejb 本身的思想还是优秀的,学习笔记是还要写下去的
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值