一、ejb、ssh、java EE开发架构位置俯瞰:
首先通过下图了解一下ssh和ejb在java EE架构中的位置:
再通过另外一张图从容器的角度了解一下,ejb和java EE的关系:
二、Ejb简介:
我们不需要为Ejb定义一个明确的定义,那是没有意义的,脑袋中有了上面的图示的印象就足够了,不过还是很有必要宏观了解一下Ejb3.0的一些个特性的:
(插话javaBean:javaBean可以简单的看成是拥有get、set方法的java类,其实这是一种良好的约定,有了这个约定,就可以方便程序员的代码操作,比如常用的Utils.copy方法等,Struts和Spring的诸多功能也是通过这个约定实现的。如,属性批量赋值、依赖注入等。另外,就纯粹的java来说,还有很多方法封装到了Utils这个类中,所以,良好的约定大大便于程序的开发,javaBean就是这么一个东东,灵巧、便捷。)
消除了对Home接口的依赖,所有的持久化对象不必再实现任何EjbAPI接口,三种Bean,只是简单的javaBean。
充分利用了JDK5.0的新特性,ejb3.0,定义了很多Annotation,覆盖了很多持久化相关的概念。如Bean的类型、依赖注入、事务管理、安全、回调、O-R映射、关系等等。
Jboss和Hibernate也都支持这些Annotation,所以,即使脱离了Ejb容器,也可以使用。
容器可以通过@Inject@Ejb、@Resourcedeng这些Annotation注入到Ejb容器中。
听过定义@PostConstruct@PreDestroy @PrePersist、@PostPersist,我们可以映射任何javaBean或者回调类的方法,让它们接收这些事件。
普通的java Bean实例,可以通过Entity Manager API持久化到数据库,Jboss和Hibernate都支持。
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,然后通过jndi的look方法找到对应的对象到客户端,然后再调用这个对象的方法,的交互过程。
下图展示了两个会话:
有状态的会话Bean就是带有成员变量或者类变量,在不同的会话之间通过这些变量保持数据,而不是简单的session来保持数据。
能够为同一个客户端的多次请求(方法调用)之间保持状态信息。如:由于某种原因,如系统要支持多种不同类型的客户端,购物篮功能作为系统的和细腻业务,需要由Ejb对象来担当,(而不是HttpSession对象),那么,Ejb必须能够区分不同的客户端,并为不同的客户端保持与其对应的状态信息。
从某个客户端的角度来看,似乎Ejb对象正被它独占,不会因为受到其他客户端同时对同一个Ejb访问影响。
通过下面两幅图对比http session和Ejb有状态会话Bean的异同:
购物过程中http session的交互过程:
有状态会话bean的交互过程:
服务器会为一个客户开辟一个ejb对象空间,这样每个客户都是不同的对象;服务器端通过令牌来识别同一个客户端在多次请求之间保持信息。
小结一下:
对比http session(通过sessionid的校验),ejb是通过Token令牌进行特定的定位。
HttpSession为每一个连接保存一个实例,Ejb在服务端通过Ejb的代理来保证有状态的会话Bean之间相互不干扰。
自然会有这样的疑问:来回传输的令牌Token中封装了哪些信息??
采用实例池,甚至是单例的方式实现,不会对状态进行管理(不是不能有状态,只是容器不管理),性能比状态bean高。
3、MDB(Message Driver Bean):消息驱动Bean,基于JMS。
消息管理分为点对点和发布/订阅模型(P2P、Pub/Sub),模型图如下:
限于篇幅,这里不细说,后续会对之做详解。
六、客户端三种访问类型:
客户端访问方式有三种,性能有差异,使用方式不同。
本地: 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容器事务的比较。