为什么我喜欢EJB 3.0并且尤其喜欢EJB 3.1

开发 后端
本文作者是一个忠实的EJB用户。在他两年多的项目经验中,他总结出了EJB 3.0的十几个优点如下。EJB 3.1在撰文时尚未发布,但作者就EJB 3.1中将出现的新特性也包含在内。

Marc Fleury在2002年写了一篇值得一读的文章 蓝皮书 "为什么我爱EJB"  (下载),他的观点在当时是令人惊讶的。我那是已经在使用EJB,但并不真正地爱他们 :-)。我没有到哪个程度,但我真的喜欢EJB 3.0。原因如下:

◆性能开销低。Glassfish v2中 只有大约3%.

◆EJB 3.0是线程安全的(thread save)。这是一个巨大的优点。 每个线程所都拥有的实例,包括所有注入的资源比如实体管理器(Entity Manager),数据源(Data Source)和JMS,都是线程安全的。最棒的是:容器为你做到了这一切。你只需要一个标识(annotation),比如引用EJB的@EJB,获取持久化上下文的@PersistenceContext以及引用资源的@Resource :-))。更多讨论请参看"plain old Web Container" :-)(想想POJO-Plain Old Java Object,译者注)。提醒一下:Servlet作为一种单例(singletons)模式不是线程安全的。

◆EJB 3.0 支持 事务(transactional)。 所以只要成功调用了EJB方法,所有的资源将都是同步的(synchronized),比如写到数据库中的数据,发给服务器的消息等。容器会为你做到这些,你只要知道你所要做的是什么 (这和平台无关,但有时难以实现 :-))
在我所有的项目中都将部署描述符而替换成了annotation。这样就只有一个persistence.xml文件需要部署。EJB在重构,部署和移植方面都表现良好。

◆EJB 3.0是真正可移植的(它可以让你中立于实现提供商和架构)。 相比EJB 2.1,这点更加突出,因为私有的部署描述符不再需要。实际上,EJB 3不再需要任何描述符。你只要部署干干净净的jar文件,然后附上在meta-inf中的persistence.xml,而其他都是可选的。

◆在EJB 3 中,惯例优先原则(Convention Over Configuration)或正式地称为基于期望的配置( Configuration By Exception) ,它们和依赖注入(Dependency Injection) 的结合非常完美。大多数场合,开发EJB只需要少量的代码(比如没有"new"的调用,而只需要做个声明)

@Stateless
public class SampleBean implements Sample {
    @PersistenceContext
    private EntityManager em;

    @EJB
    private Another anotherBean;

◆Getters 和Setters方法是可选的: 不仅对于EJB,同样对于JPA。 资源可以直接注入到字段之中。
缺省和annotation的配置能够被XML描述符覆盖。而XML描述符不需面面俱到 - 你只要指定感兴趣的部分。你可以为某个特定阶段(比如测试、集成)开发通过XML描述对产品进行重新设置。

◆不需要特别的工具。你只需要annotation,一个Java 6 的编辑器和一个Jar文件。 无论是IntelliJ,Eclipse (含500附件的插件:-))还是Netbeans 6.1都对EJB 3提供了完善的支持,并对应用服务器也做了很好的集成,EJB的部署、取消部署、配置等都可以直接由IDE来管理。

◆EJB 3.1可嵌入的特性很可能将获得支持。Glassfish v3已经对此提供支持。在GlassFish的测试中,我发现容器的启动只要令人惊讶的500ms。 此外,JBoss也支持可嵌入。

◆EJB 3.1将提供许多有用的特性:Singletons (更便于配置和用于启动类等), 更好的timer支持 (cron-like),将来的异步方法,可选的local-interfaces 和基于WAR包的部署。

◆池的设置和线程池的配置对伸缩性的控制非常有帮助(除非容器崩溃,否则你不会为无法确定伸缩性而头痛:-))

◆和脚本语言交互的良好支持(包括JavaScript, Groovy)

◆EJB是缺省可以被管理和监控的。EJB部署到容器后,你就可以对其方法调用和性能等进行监控。

◆不需事先依赖任何的架构和库等。ejb-jar和容器为你的应用代码打理一切,所以抛出像NoClassDefFoundErrors,ClassCastExceptions这样异常的可能会降到最低。

◆EJB 3.0是超级紧凑的技术。实际上你已经不可能再为它做些什么简化 :-)。当然,这方面我也愿意听大家的意见。

◆他们非常容易测试-因为EJB就是一些类和接口。你甚至可以在容器之外启动它们。

◆即使最简单的use cases也可以用EJB 3高效的实现。比如关于增删查改的 CRUD的例子:

@Stateless
public class CrudServiceBean implements CrudService<Integer,Customer> {
   
    @PersistenceContext
    private EntityManager em;

    public Customer create(Customer t) {
        this.em.persist(t);
        return t;
    }

    public void delete(Customer t) {
        t = this.em.merge(t);
        this.em.remove(t);
    }

    public Customer find(Integer id) {
        return this.em.find(Customer.class, id);
    }

    public Customer update(Customer t) {
        return this.em.merge(t);
    }
 }

◆他们工作的非常棒:近两年来,我在项目中使用EJB 3.0 + JPA 1.0。它们的出色表现不仅给我带来的惊喜,也给我们团队的带来了惊喜。

然而,Java EE6平台仍有可以提升的空间。JMS规范应该重新设计,让其更加“流畅”(fluent)。JNDI注册机制显得陈旧,有关JNDI的API的改进和简化将不仅有助于EJB的开发,而且整个Java EE平台也将因此受惠。

【编辑推荐】

  1. EJB3.1新特性一览 Time服务更强大
  2. 关于EJB的一些常见问题
  3. JavaBean与EJB的区别与应用
  4. EJB初学者常见的12个困惑问与答
  5. Java语言中关于EJB技术的概论
责任编辑:yangsai 来源: 译言
相关推荐

2012-04-04 22:07:12

Android

2019-10-23 15:53:16

JavaScript可选链对象

2009-06-11 16:53:09

什么是EJBEJB

2009-06-12 12:46:59

EJB3.0

2019-08-28 10:53:35

JavaScriptOptional Ch代码

2023-09-14 08:00:00

基于主干的开发分支模型

2020-06-11 09:09:33

Ansible模块Linux

2009-06-15 16:06:25

JBoss IDE

2015-10-26 09:58:53

程序员主流

2020-07-28 10:45:51

数据库三范式MySQL

2017-11-30 15:25:04

EclipseGo项目

2017-09-11 19:58:06

PostgreSQLMySQL数据库

2009-06-12 09:41:07

EJB3.0Spring

2009-06-11 15:26:05

EJB组件EJB容器

2018-01-09 18:46:44

数据库架构读写分离

2018-01-15 05:54:45

数据库读写分离互联网

2012-05-14 08:55:23

Android

2009-06-22 16:59:33

POJOSpringEJB 3.0

2020-12-20 17:34:50

Linux命令行终端

2022-12-27 09:50:26

数据库方式
点赞
收藏

51CTO技术栈公众号