• 1. J2EE技术平台胡晓军
  • 2. Enterprise JavaBeans(EJB) 是: Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。 EJB容器是: 一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。 EJB服务器是: 管理EJB容器的高端进程或应用程序,并提供对系统服务的访问。EJB服务器也可以提供厂商自己的特性,如优化的数据库访问接口,对其他服务(如CORBA服务)的访问。一个EJB服务器必须提供对可访问JNDI的名字服务和事务服务支持。 什么是EJB
  • 3. EJB架构
  • 4. Enterprise JavaBeans有三种类型: Entity Beans 代表数据 在服务器重启后仍然存在 可以通过EJB container (“CMP”) 或者程序 (“BMP”) 持续化到数据库 Session Beans 执行动作 等价于‘一般’的 Java object, 只不过是在远程 可以是 stateless (是原子操作), 或 stateful (在一个 context中执行一系列的操作) Message Driven BeanEJB介绍
  • 5. Enterprise JavaBeans
  • 6. EJB服务器和容器
  • 7. EJB容器的功能
  • 8. EJB使用的技术RMI(Remote Method Invoke) 正如其名字所表示的那样,RMI协议调用远程对象上方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。 RMI-IIOP 它在Internet Inter-ORBProtocol(IIOP)之上提供了通常的Java Remote Method Invocation(Java 远程方法调用RMI)API的一种实现。它在RMI和CORBA应用程序之间架起了桥梁。这是在J2EE容器之间使用的一种标准通信协议。 JMS(Java Message Service) JMS 是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域,有支持发布/订阅(publish/subscribe)类型的域,并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。 JTA(Java Transaction Architecture) JTA 定义了一种标准的API,应用系统由此可以访问各种事务监控。
  • 9. EJB实现EJB Server负责与操作系统有关的底层细节,诸如和其它组件或系统的通讯协议、多线程、负载平衡等,EJB Container提供EJB的生存环境和各种服务(如Transaction Server),EJB Container和Server共同组成了EJB运行环境。 通过使用RMI(Remote Method Invocation),EJB支持远程的客户端存取。 RMI产生一个对象,这个对象被安装在客户机系统中,作为存取服务器对象的代理对象。它使得服务器的位置对于客户机来说是透明的,EJB开发人员为每一个可存取的接口定义一个Java远程接口。 通过使用IIOP协议,EJB也可以和其他的非Java客户机进行通讯,IIOP允许EJB系统和CORBA的集成。EJB可以存取CORBA服务器,CORBA客户机也可以存取EJB服务器。
  • 10. 业务数据模型 对业务概念的反映,也称为领域类(domain class) 在持久存储中业务实体的对象视图 提供访问和操作数据的对象封装 支持多用户共享的数据 可以从数据库中存储的属性重新实例化 EJB 服务器崩溃后仍可重构 与数据库中的数据有一样长的生命实体Bean(Entity Bean)
  • 11. Bean-Managed Persistence(自管理的持久性) 优点: 开发者有完全的控制 无需复杂的提供商支持 缺点: 编码复杂 在改变时需要重新编码和部署 影响可移植性 Container-Managed Persistence(容器管理的持久性) 优点: 提供商解决,可能会有更好的缓冲和性能 在部署描述符中进行改变即可 可移植性好 缺点: 对容器提供商的工具依赖性强 可能不易反映复杂的数据关系实体Bean的持久性
  • 12. 会话bean经常用于涉及多个实体bean的业务处理和控制逻辑SessionEntityEntityEntity会话Bean(Session Bean)-1
  • 13. 相对生命较短(一般与客户同步) 在EJB服务器崩溃时被删除 不表示数据库中的数据,但可以访问数据 作为一个客户的代表执行功能 可以加入事务 会话Bean(Session Bean)-2
  • 14. 使用会话bean 对针对于某一客户的处理或控制对象建模 对工作流、任务和管理活动等建模(如订房、购物车等) 协调多个实体bean,控制实体bean之间的交互 将业务应用逻辑从客户端转移到服务器端何时使用会话Bean
  • 15. 会话bean 表示一个业务过程 每一客户一个实例 Short-lived:与客户生命同步 暂态的 服务器崩溃后丢失 可以是事务性的实体bean 表示业务数据 在多个客户间共享实例 Long-lived:与数据库中数据同步 持久的 服务器崩溃后可重构 总是事务性的 会话Bean与实体Bean比较
  • 16. 无状态(Stateless)bean 表达一个无状态的服务(如列表,mail) 不存储用户相关信息,进行对请求的响应 暂态的 可用来构造响应频繁而简单的访问的bean池 有状态(Stateful)bean 维护客户状态 会话Bean的分类
  • 17. Goals of EJB 3.0EJB 2.1 is too “noisy” Too many interfaces to implement “XML Hell” too many complex deployment descriptors API is too verbose API too complicated in general Simplify the EJB programming model Focus on ease of use Facilitate Test Driven Development Make it simpler for average developer Increase developer base
  • 18. EJB 3.0主要的应用服务器支持情况 WebSphere 6.1 Weblogic 10.0 JBoss 4.2.x GlassFish 2.x Geronimo 2.x
  • 19. SESSION BEANS Compare EJB 2.1 vs. EJB 3.0
  • 20. EJB 2.1: RequirementsHome interface Remote/Local interface Bean class must implement javax.ejb.SessionBean XML Deployment descriptor
  • 21. EJB 2.1: Required Interfacespublic interface CalculatorHome extends javax.ejb.EJBHome { public Calculator create() throws CreateException; } public interface Calculator extends EJBObject { Public int add(int x, int y) throws RemoteException; Public int subtract(int x, int y) throws RemoteException; } Homes for stateless beans unnecessary Remote interface must inherit from EJBObject Remote methods must throw RemoteException Dependency on RMI
  • 22. EJB 2.1: Bean class requirementspublic class CalculatorBean implements javax.ejb.Sessionbean { private SessionContext ctx; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void ejbCreate() { } public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { return x – y; } }Must extend verbose javax.ejb.SessionBean Unnecessary and verbose callback methods
  • 23. EJB 2.1: XML Deployment Descriptor CalculatorBean org.acme.CalculatorHome org.acme.CalculatorBean org.acme.CalculatorRemote Stateless Container ….
  • 24. EJB 3.0: GoalsRemove unnecessary interfaces Remove unnecessary callbacks Make deployment descriptors optional Make beans pojo-like Use default values where they make sense
  • 25. Required Interfaces@Remote public interface Calculator { public int add(int x, int y); public int subtract(int x, int y); } @Stateless Public class CalculatorBean implements Calculator { public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { Return x – y; } } Homeless Methods don’t throw RemoteException No verbose interface implementations
  • 26. Stateful Beans@Remote public interface ShoppingCart { public void addItem(int prodId, int quantity); public void checkout(); } @Stateful public class ShoppingCartBean implements ShoppingCart { @Remove public void checkout() { … } }Still homeless Created as they are looked up @Remove replaces EJBObject.remove Stateful bean is removed after method called
  • 27. Transactions and Security @Stateful public class ShoppingCartBean implements ShoppingCart { @Remove @TransactionAttribute(REQUIRED) @MethodPermission({“valid_customer”}) public void checkout() { … } }
  • 28. ENTITY BEANS POJO based persistence
  • 29. EJB 3.0 Entity BeansO/R Mapping Metadata as annotations Table mappings, @Table, @SecondaryTable Column mappings, @Column, @JoinColumn Relationships, @ManyToOne, @OneToOne, @OneToMany, @ManyToMany Multi-Table mappings, @SecondaryTable Embedded objects, @Dependent Inheritance, @Inheritance, @DiscriminatorColumn Identifier + Version properties, @Id, @Version
  • 30. Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String productName; private Set bids = new HashSet(); private User seller; @Id(generate=GeneratorType.AUTO) @Column(name=“ITEM_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. relational table declarationauto-key generation
  • 31. Entity ManagerEntities created as any plain Java object Customer cust = new Customer(); Plain Java objects and homeless Can be detached and reattached to container Can be serialized to remote client Remote client can perform updates on local copy Copy can be sent back to server and merged back in Persisted by the EntityManager service All access through this service Creation, retrieval, removal, and merging Analogous to Hibernate Session
  • 32. EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @PersistenceContext private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } } Inject the EntityManager service
  • 33. EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @PersistenceContext private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } } Item allocated remotely If cascade CREATE, entire object graph inserted into storage
  • 34. EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @PersistenceContext private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } } Item found with primary key Detached from persistent storage at tx completion Can be serialized like any other object
  • 35. EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @PersistenceContext private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } } Item can be updated remotely and merged back to persistent storage Item instance is reattached to storage with merge() call
  • 36. InheritancePersistence mapping supports inheritance Single table per hierarchy – SINGLE_TABLE Join table per subclass – JOINED Distinct table per subclass – UNION Queries on class hierarchy are polymorphic
  • 37. Inheritance – SINGLE_TABLE@Entity @Table(name="Animal") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="TYPE") public class Animal { @Id private int id; @Column(name="AVG_WEIGHT") private int averageWeight; ... } @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public class Dog extends Animal{ @Column(name="BREED") private String breed; ... }
  • 38. Inheritance – SINGLE_TABLEcreate table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number, BREED varchar(255) );
  • 39. Inheritance – JOINED@Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="TYPE") @Table(name="Animal") public class Animal{ @Id private int id; @Column(name="AVG_WEIGHT") private int averageWeight; ... } @Entity @InheritanceJoinColumn(name="DOGGY_ID") @Table(name="Doggy") public class Dog extends Animal{ @Column(name="BREED") private String breed; ... }
  • 40. Inheritance – JOINEDcreate table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number ); create table Doggy ( DOGGY_ID Number, BREED varchar(255) );