ejb概述——(一)

一、ejb、ssh、java EE开发架构位置俯瞰:

    首先通过下图了解一下ssh和ejb在java EE架构中的位置:

ejb概述——(一)_第1张图片

 

  再通过另外一张图从容器的角度了解一下,ejb和java EE的关系:

ejb概述——(一)_第2张图片

 二、Ejb简介:

    我们不需要为Ejb定义一个明确的定义,那是没有意义的,脑袋中有了上面的图示的印象就足够了,不过还是很有必要宏观了解一下Ejb3.0的一些个特性的:

插话javaBean:javaBean可以简单的看成是拥有getset方法的java类,其实这是一种良好的约定,有了这个约定,就可以方便程序员的代码操作,比如常用的Utils.copy方法等,StrutsSpring的诸多功能也是通过这个约定实现的。如,属性批量赋值、依赖注入等。另外,就纯粹的java来说,还有很多方法封装到了Utils这个类中,所以,良好的约定大大便于程序的开发,javaBean就是这么一个东东,灵巧、便捷。)

 

  • 简化的Ejb API :

消除了对Home接口的依赖,所有的持久化对象不必再实现任何EjbAPI接口,三种Bean,只是简单的javaBean

 

  • Annotation

充分利用了JDK5.0的新特性,ejb3.0,定义了很多Annotation,覆盖了很多持久化相关的概念。如Bean的类型、依赖注入、事务管理、安全、回调、O-R映射、关系等等。

JbossHibernate也都支持这些Annotation,所以,即使脱离了Ejb容器,也可以使用。

  • 依赖注入:

容器可以通过@Inject@Ejb@Resourcedeng这些Annotation注入到Ejb容器中。

 

  • 可选的回调机制:

听过定义@PostConstruct@PreDestroy @PrePersist@PostPersist,我们可以映射任何javaBean或者回调类的方法,让它们接收这些事件。

  • Entity Manager API

普通的java Bean实例,可以通过Entity Manager API持久化到数据库,JbossHibernate都支持。

  • 简化的持久化模型和改良的查询:

3.0增强了EJB-QL查询语言,支持动态查询、子查询、批量更新、批量删除等。这些都会给项目带来很大飞方便。

  • 脱离容器使用:

可以在普通的java程序何总使用持久化API

 

四、Why Ejb?

    最重要的理由是分布式!通过分布式对象之间的相互协作,在客户端代码中无需指定分布式对象的位置。

分布式对象之间的事务支持(RMI不支持)。

 

五、ejb的三种Bean:

    三种Baen(Entity Bean、Session Bean、MDB)是ejb的基础。也即:企业Bean(SessionBean、MDB)和持久(Entity Bean)。

    1、Entity Bean:实体bean可以简单的理解成普通的实体。在ejb2中,还将EntityBean分为了BMP(Bean管理持久化实体Bean和CMP(容器管理持久化Bean))。

      类似Hibernate,还有EntityManager、EJB-QL(查询语言)、OR映射。在注解方面跟hibernate很类似。

    2、SessionBean:分为有状态的Stateful Session Bean和无状态的Stateless Session Bean。

先来了解一下什么是会话:

会话是客户端通过容器查找到ejb,然后通过jndilook方法找到对应的对象到客户端,然后再调用这个对象的方法,的交互过程。

    下图展示了两个会话:

ejb概述——(一)_第3张图片

 

  有状态的会话Bean就是带有成员变量或者类变量,在不同的会话之间通过这些变量保持数据,而不是简单的session来保持数据。

  • 有状态会话bean

    能够为同一个客户端的多次请求(方法调用)之间保持状态信息。如:由于某种原因,如系统要支持多种不同类型的客户端,购物篮功能作为系统的和细腻业务,需要由Ejb对象来担当,(而不是HttpSession对象),那么,Ejb必须能够区分不同的客户端,并为不同的客户端保持与其对应的状态信息。

  从某个客户端的角度来看,似乎Ejb对象正被它独占,不会因为受到其他客户端同时对同一个Ejb访问影响。

  通过下面两幅图对比http session和Ejb有状态会话Bean的异同:

  购物过程中http session的交互过程:

ejb概述——(一)_第4张图片

 

有状态会话bean的交互过程:

ejb概述——(一)_第5张图片

  服务器会为一个客户开辟一个ejb对象空间,这样每个客户都是不同的对象;服务器端通过令牌来识别同一个客户端在多次请求之间保持信息。 

小结一下:

  对比http session(通过sessionid的校验),ejb是通过Token令牌进行特定的定位。

HttpSession为每一个连接保存一个实例,Ejb在服务端通过Ejb的代理来保证有状态的会话Bean之间相互不干扰。 

自然会有这样的疑问:来回传输的令牌Token中封装了哪些信息?? 

  •  无状态会话bean:

  采用实例池,甚至是单例的方式实现,不会对状态进行管理(不是不能有状态,只是容器不管理),性能比状态bean

 

    3、MDB(Message Driver Bean):消息驱动Bean,基于JMS。

    消息管理分为点对点和发布/订阅模型(P2P、Pub/Sub),模型图如下:

ejb概述——(一)_第6张图片

限于篇幅,这里不细说,后续会对之做详解。 

  

 六、客户端三种访问类型

    客户端访问方式有三种,性能有差异,使用方式不同。

  本地:    ejb对象运行在同一个jvm

  远程:     不同的jvm

    Webservice:只能访问无状态的会话bean

 

  这也是Ejb的重点,后续会做详细解释。 

 

七、总结:

    学习ejb必须明白的是三种bean:Entity Bean、Session Bean、MDB;

    关于JPA数据持久化框架 Persistence:Entity Bean、Entity Manager、Ejb-QL(查询语言)、OR映射;与Hibernate很相似,对比学习;

    事务处理(Transaction)以及与Spring容器事务的比较。

你可能感兴趣的:(ejb概述——(一))