EJB这项技术其实已经消亡了,但为何我还专门单另拿出来讲呢?原因有三。
第一、EJB是J2EE雄霸全球的功臣,它把我们编程推向了分布式架构开发,为开发大型项目做好了铺垫,也是java强于其它语言的一个重要标志。
第二、EJB技术虽然失败了,但是EJB的思想并没有消亡,今天的分布架构、微服务架构都起源于它。
第三、EJB快速消亡的“罪魁祸首”,虽然让J2EE黯然失色,直接“破产”,但它却让Java迎来了第二春,那就是Spring框架。不夸张的说今天学Java其真正学的是Spring框架。如:开发中小项目的基础框架三大框架SSM,两大框架和Spring相关,SpringMVC和Spring。开发大型项目微服务架构SpringCloud,听这名字你就知道,全是基于Spring的东西。而今天如果你应聘java开发岗位,你说你不会微服务,那就地88。
这么传奇吗?就这么传奇,那大家搬好小板凳,快听我给大家来说说。
那一切还得从一本书说起。
下面这本书的作者叫Rod Johnson(罗德·约翰逊),一看发际线就知道是个高手,他就是Spring的作者,一个初出茅庐的人干翻了SUN公司正如火如荼,如日中天,当时的软件企业,甚至世界500强正纷纷膜拜EJB时。他出品了这本书,立刻一片哗然。
乍一看这本书的名字,Expert one-on-one (专家一对一)J2EE Development without EJB (J2EE开发不用EJB )并没有给人带来太冲击。毕竟关于J2EE的书太多了,而without EJB看上去有点象是故意挑衅EJB的感觉。一本J2EE的书怎么可能会给人带来信念或思维的冲击呢?但意向不到的是,它做到了。
那我们先得说清EJB,在说他怎么干掉的EJB。
EJB是Enterprise Java Beans技术的简称, 又被称为企业级Java Beans。这种技术最早是由美国计算公司研发出来的。EJB技术的诞生标志着Java Beans的运行正式从客户端领域(单一服务器)扩展到服务器领域(分布式服务器集群)。在电子商务领域运用EJB技术可以简化应用系统的开发, 这是由该技术的结构和特点所决定的。
EJB (Enterprise Java Beans) 是基于分布式事务处理的企业级应用程序的组件。Sun公司发布的文档中对EJB的定义是:EJB是用于开发和部署多层结构的、分布式的、面向对象的Java应用系统的跨平台的构件体系结构。
在开发分布式系统时, 采用EJB可以使得开发商业应用系统变得容易, 应用系统可以在一个支持EJB的环境中开发, 开发完之后部署在其它的EJB环境中, 随着需求的改变, 应用系统可以不加修改地迁移到其它功能更强、更复杂的服务器上。EJB在系统实现业务逻辑层里面负责表示程序的逻辑和提供访问数据库的接口。
由于IBM和Sun Microsystems等EJB提倡者力推其前景,起初一些大公司纷纷采用EJB部署他们的系统。然而随后各种问题便接踵而至,对EJB的恶评短时间内激增。
对于初学者,EJB的API显得太过困难;对于许多程序员来说,书写那些必须抛出特定异常的接口并将bean类作为抽象类实现的做法既不直观也不正常。当然,EJB所被赋予的使命,如对象关系映射和事务管理确实有其天然复杂性,但其API之复杂还是令开发人员们觉得望而却步,一些人开始怀疑EJB除了引入了复杂的实现手段以外似乎并未带来什么实际好处。
另外,实际运用中被发现,如果使用EJB来封装业务逻辑会带来性能上的下降。这是因为,最早的EJB规范只允许客户端通过特定协议(如CORBA)进行远程方法调用来调用,即使大部分实际应用根本就不需要分布式计算。直到EJB 2.0才引入了本地接口,以支持可以开发不通过网络就能直接本地调用的EJB系统。
尽管如此,EJB的广泛普及仍然为其复杂度所制约。尽管已经有一些高质量的集成开发工具可以协助开发人员通过自动编码解决一部分重复作业,但这并不能降低学习此项技术的难度。
另一方面,“草根阶层”的编程爱好者们发起了一场旨在使用 “轻量级”技术以代替复杂的EJB的运动。这些技术包括Hibernate(用于提供数据持久化和对象-关系映射)及Spring框架(用于封装业务逻辑)。尽管它们不像EJB那样有巨头支持,但其在庶民间却更加流行,并且也被一些对EJB深感失望的企业所采用。
EJB规范起初的一个主要价值—对分布式应用进行事务管理—在随后的实践中被一致认为几乎没能派上用场。对于企业级应用来说,Spring和Hibernate等简化框架更加实用。因此,EJB 3.0规范(JSR 220)为了迎合这个趋势相比于其前辈进行了一次激进的大跳跃。受到Spring 影响,EJB 3.0也使用所谓的“传统简单Java对象(POJO)”;同时,支持依赖注入来简化全异系统的集成与配置。Hibernate的创始人Gavin King参与了这一新版规范的制订,并对EJB大加提倡。Hibernate的许多特性也被引入到Java持久化API当中,从而取代原来的实体bean。EJB 3.0规范大幅采用Java注释(annotation)来对代码进行元数据修饰,从而消减了此前EJB编程的冗杂性。
但此时已经为时已晚,Hibernate和Spring的成功,让EJB黯然退出市场。
但在我看来,在当时单机服务器就足够的时代,EJB太先进了,相当于牛刀杀鸡不好用太麻烦,再者它没有像今天微服务使用那么轻巧,所以才被弃用。而且Hibernate、Spring还是单机产物,其实并没有胜过EJB分布式的架构。
可这就是历史,太先进太超前的东西不会被立刻接受的。