【J2EE】企业级项目开发总结--EJB篇

        很多人都觉得EJB高大上,就是复杂,难学难用.其实J2EE是企业级但它并没有我们想象的那么笨重,和那些轻量级的框架们比,它有着得天独厚的优势,好比Word,Excel...它们庞大的Office家族都是微软出来的,它们彼此相连,互帮互助.如此,EJB使用了其它很多标准规范(诸如JTA、JDBC/RMI/IIOP等)来实现自己的功能。使用J2EE规范,可以很容易地在J2EE技术不同实现间进行转换。因而,应用和其中包括的组件可在J2EE的实现间移植.

 

        先来明确几个概念.

 

组件:

可重用的可部署的,有自己的行为特征和事件的能完成独立功能的软件单元.

EJB组件:

没错,EJB是组件,在EJB的语言中它们被称为bean.

容器:

容器就是组件和底层服务细节之间的接口.

EJB容器:

       对每一个想让服务器处理的组件,它产生一个EJB容器,这个EJB容器容纳了所有组件,并使它们可用.也就是说          EJB容器负责管理EJB运行.

 

       EJB怎么一会是组件,一会是容器,还能管理它自己运行?好吧,如果你被搞晕了,那就请继续往下看,看下去就会明了的.

 

EJB(Enterprise JavaBean)的三种类型:

 

1.SessionBean

2.EntittyBean

3.MessageDrivenBean

 

【J2EE】企业级项目开发总结--EJB篇_第1张图片


1.1 StatelessSessionBean(无状态的会话bean)


        无状态是指此类bean的实例不具有任何与使用它们的客户相关联的状态.什么意思呢?如果EJB容器创建了10个无状态会话bean实例,它可以调用其中的任何一个来服务于所调用的业务方法.因为实例并不和任何一个客户相连.那创建10那么多干什么?使用一个实例不就行了吗?是,答案是肯定的,使用一个实例完全可以,但是因为EJB规范有规定,同一时间只有一个线程能执行一个bean实例,要是有两个客户想在同一时间调用同一个无状态会话bean,那有一个就得等着!要不想等呢,那就需要2个实例了.

 

        无状态的会话bean可不是说他们的实例不允许具有任何特性,而是不具有与使用它们的客户绑定的特性而已.

 

1.2 StatefulSessionBean(有状态的会话bean)

       

        当通过EJBHome创建了一个有状态的会话bean时,在它的EJB容器中会产生一个供创建它的客户专用的实例.这个实例包含了它需要的任何状态,EJBHome可能会传送一些和客户有关的并且在这个会话bean生命期(session不被关闭)中都应该存在的数据.每当客户调用该EJBHOme时,这个实例就会使用特定于客户的信息,这个是专门给该客户干活的.

 

         如果有太多的客户,EJB容器中就会产生太多的实例,这就会出现导致内存耗尽的情况.怎么办?多说一点儿,处理这种问题的机制叫激活/钝化.容器会把一个实例交换到硬盘上,等客户想调用该会话时再从硬盘上重新读入,即激活.客户不会感觉到这种情况.这么一来,容器可以支持很多客户,也不会出现内存耗尽.

 

1.3 EntityBean(实体bean)


        实体bean用于表示持久的对象或者域模型对象.通常用Entity或Domain表示.一个实体bean具有一个用于标识实例个体的主键,并且实体bean的状态通常保存在一个数据库里.实体bean是被所有客户所共用的,一个客户创建了实体bean,另一个客户可查找到并删除它.这就会出现多个客户同时操作同一实体bean的情况,容器也有处理办法,原则就是保证同一时间只有一个线程可以访问EJB实例.

        关于实体bean,在JPA中会有更深刻的理解.

 

 

        最后画了一张图,有点丑,不过简单说明了容器和组件以及客户端调用时的关系.


【J2EE】企业级项目开发总结--EJB篇_第2张图片




           EJB存在的意义在于,写组件的就专心写组件,写容器的就专心写容器,然后把写好的组件扔到容器中去运行,组件可以声明他想要的服务,比如要访问某个数据库,容器就访问了数据库,它想要事务处理以特定的方式处理,容器就按照特定方式处理…EJB组件和容器之间各干各的,合作起来很默契,耦合松松哒因为他们之间事先定好了规范,这么一组bean提供者用来和容器进行交互的API,和容器可用来和组件进行交互的API就是EJB规范.达到了组件在容器中可插拔的目的.



你可能感兴趣的:(【J2EE】企业级项目开发总结--EJB篇)