Time EJB —— 近似 EJB 3.0
我们使用 EJB 3.0 重新编写 Time EJB。跟前面一样,首先编写一个描述服务的接口。只是这次对接口执行较少的操作即可使之成为 EJB 接口。请观察一下清单 8。
清单 8. TimeBean 接口
2
3 import java.util.Date;
4
5 import javax.ejb.Remote;
6
7 @Remote
8 public interface Time {
9 public Date currentTime();
10 }
11
注意,它和 清单 1 何其相似。唯一添加的是一个注释,将其声明为远程接口。您无需扩展接口或抛出 RemoteException。EJB 3.0 规范允许您省略所有的注释,前提是对实现类进行正确的注释并且只实现一个接口。保留这些注释仍然是个不错的做法;可以使代码更易于维护。接下来看看接口的实现,如清单 9 所示。
清单 9. TimeBean EJB 实现
2
3 import java.util.Date;
4
5 import javax.ejb.Stateless;
6
7 @Stateless
8 public class TimeBean implements Time{
9
10 public Date currentTime(){
11 return new Date();
12 }
13 }
14
此类 EJB 通常称为普通旧式 Java 对象(POJO)。原因在于唯一能够证明它是 EJB 的是 @Stateless 注释。接口中再也没有实现回调函数。如果需要实现一个回调函数,只需添加一个方法并通过注释将其声明为回调函数即可。您可以随时调用该方法,因为不用实现接口。
现在来看看部署描述符。等等,还没有部署描述符!如果您先前没有了解到 EJB 3.0(可以推知 Java EE 5)的重要性,希望您现在可以有一个了解。对于简化开发而言这算得上是一个跨越。当然,其本质只是一个规范。您需要一个实现来使用这些较好的思想。Geronimo 2.0 和 OpenEJB 3.0 就应运而生了。
Geronimo 2 —— Java EE 5
您仅仅了解了一些表面信息,但是您可能知道 Java EE 5 与 J2EE 1.4 差别巨大。它们具有很多相同的概念。应用服务器所提供的服务也相同,比如分布式计算、事务管理和持久性。但是,这些服务的 API 却完全不同。EJB 的开发简化了很多,但是这就意味着 Java EE 5 应用服务器必须提供比以前更多的功能。因此,Geronimo 开发人员在实现 Java EE 5 规范时需要做大量的工作。对于 OpenEJB 而言这种情况表现得尤为明显,因为再次需要依靠它作为 Geronimo 的基础,而且它实现了这个全新的 EJB 3.0 规范。
在撰写本文时,Apache Geronimo 已经通过了 Java EE 5.0 TCK。开发人员终于尝到了胜利的果实 —— 他们可以享受使用新的 EJB 3 API 和将其更加整洁简单的代码部署到 Geronimo 上的乐趣。
孵化器状态
另外一个值得注意的有趣现象是,OpenEJB 项目现在已经成为一个 Apache Incubator 项目。Apache Geronimo 团队为 OpenEJB 的 EJB 2.1 实现作出了很大的贡献,因为后者是 Geronimo 的 J2EE 1.4 实现的关键。但是,OpenEJB 还没有准备好加入到 Apache 中。通常还需要一些文书工作,现在 OpenEJB 已成为 Incubator 的一部分。EJB 3.0 正作为一个 Apache 项目在实现,而它的成功实现将为帮助 OpenEJB 成为一个优异的 Apache 项目跨进一大步。
结束语
本文介绍了 J2EE 和 EJB 规范多年以来的发展历程。您不仅见识了该规范的强大功能,还了解了由此导致的复杂编程模型给 Java 编程人员所带来的痛苦。您已经体验到了 Java EE 5 和 EJB 3.0 规范如何旨在解决这些痛苦并极大地提高 Java 开发人员的生产率。它是一个非常简化的编程模型,不仅可以立刻提高生产率,而且所开发的应用程序更加易于维护。
Geronimo 的第一个版本实现了 J2EE 1.4 规范。OpenEJB 提供的 EJB 2.1 规范是 J2EE 1.4 的一部分。现在,Geronimo 正致力于实现 Java EE 5 规范,而 OpenEJB 则需要实现 EJB 3.0 规范。这些规范的实现已经取得了很大进展;鼓励您下载 Geronimo 的最新版本开始享受 Java EE 5 和 EJB 3.0 规范带来的好处。