程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> EJB3.0的三大類型詳解

EJB3.0的三大類型詳解

編輯:關於JAVA

無論你創建bean會話是為了執行特定任務,還是把表映射到實體bean以更新數據,都可以使用普通的Java對象和接口來完成這些工作,並且可以通過在業務方法中使用注釋,把方法提供給客戶端。

Enterprise JavaBean (EJB) 是可重用的、可移植的 J2EE 組件。EJB 由封裝業務邏輯的方法組成。譬如說,EJB 可能有這樣的業務邏輯:包含了更新數據庫中客戶數據的方法。眾多遠程和本地客戶端可以調用該方法。另外,EJB 在容器裡面運行,這樣開發人員只要關注bean裡面的業務邏輯,不必擔心復雜、容易出錯的問題,譬如事務支持、安全性和遠程對象訪問等。EJB 作為普通Java對象(POJO)的形式來開發,開發人員可以使用元數據注釋(metadata annotations)來指定容器如何管理這些bean。

EJB 包括三種主要類型:會話 bean、實體 bean和消息驅動的bean。會話bean執行獨立的、解除耦合的任務,譬如檢查客戶的信用記錄。實體bean是一個復雜的業務實體,它代表數據庫中存在的業務對象。消息驅動的bean用於接收異步JMS 消息。下面,讓我們進一步研究EJB 3.0規范中的這些類型。

一、會話bean

會話bean通常代表業務流程裡面的操作,譬如“處理訂單”。可根據對話狀態的保持性,即有狀態和無狀態對會話bean進行分類。

無狀態的會話 bean沒有內部狀態。它們不跟蹤記錄從一個方法調用傳遞到另一個方法調用的信息。因此,每次調用無狀態的業務方法都獨立於前一次調用,譬如計算稅款或者運費。用某個應稅值調用計算稅款的方法時,對稅款值進行計算並返回給調用方法,而不必保存調用者的內部狀態供以後調用。因為這些bean並不保持狀態,所以容器對它們進行管理就很簡單。客戶端請求無狀態的bean實例時,可以從容器保持的無狀態的會話bean 實例池當中接收一個實例。另外,因為無狀態的會話 bean可以共享,所以容器可保持數量較少的實例為許多客戶端提供服務。想指定Java Bean作為無狀態的會話bean加以部署及管理,只需要為該bean添加注釋@Stateless。

有狀態的會話 bean在方法調用時可保持對話狀態,譬如客戶的網上購物車。客戶開始網上購物時,可以從數據庫中檢索客戶的詳細信息。客戶往購物車裡面添加商品或者從裡面刪除商品、下訂單等時調用的其他方法也可以使用這些詳細信息。不過,有狀態的會話bean是暫時性的,因為出現會話終止、系統崩潰或者網絡故障後,狀態不復存在。客戶端請求有狀態的會話bean實例時,就為該客戶端分配一個有狀態的實例,並為該客戶端保持該組件的狀態。要指定容器在某個方法完成後刪除有狀態的會話bean實例,只要為該方法添加注釋@Remove。

會話 bean示例如下:

import javax.ejb.Stateless.*;
   /*A simple stateless session bean implementing
   the incrementValue() method of the * CalculateEJB interface.*/
   @Stateless(name="CalculateEJB")
   public class CalculateEJBBean
   implements CalculateEJB
   {
   int value = 0;
   public String incrementValue()
   {
   value++;
   return "value incremented by 1";
   }
   }

二、實體bean

實體bean是管理持久性數據的一個對象,有可能使用幾個相關的Java對象,並可以通過主鍵實現惟一性。通過添加@Entity注釋,可以把某類指定為實體bean。實體bean代表數據庫中的持久性數據,如客戶表中的一行或者員工表中的一條員工記錄。實體bean還可以在多個客戶端之間共享。譬如說,某個員工實體bean可以由多個客戶端用於計算某員工的年薪或者更新員工地址。實體bean對象的特定字段可以成為持久性字段。實體bean中沒有被@Transient注釋標記的所有字段都被視為持久性字段。EJB 3.0的一個主要特性就是,能夠使用元數據注釋來創建包含對象/關系映射的實體bean。譬如說,想指定把實體bean的empId字段映射到 Employees表中的EMPNO屬性,就要使用@Table(name="Employees") 來注釋表名,使用 @Column(name="EMPNO") 來注釋字段,如下面的例子所示。另外,EJB 3.0 的一個特性是,在開發期間可以方便地測試實體bean,因為現在使用 Oracle 應用服務器實體測試工具,就可以在容器外面運行實體bean。

實體 bean示例如下:

import javax.persistence.*;
   import java.util.ArrayList;
   import java.util.Collection;
   @Entity
   @Table(name = "EMPLOYEES")
   public class Employee implements java.io.Serializable
   {
   private int empId;
   private String eName;
   private double sal;
   @Id
   @Column(name="EMPNO", primaryKey=true)
   public int getEmpId()
   { return empId;}
   public void setEmpId(int empId)
   { this.empId = empId; }
   public String getEname()
   { return eName; }
   public void setEname(String eName)
   { this.eName = eName; }
   public double getSal()
   { return sal; }
   public void setSal(double sal)
   { this.sal = sal; }
   public String toString()
   {StringBuffer buf = new StringBuffer();
   buf.append("Class:")
   .append(this.getClass().getName()).append(" ::")
   .append(" empId:").append(getEmpId()).append(" ename:")
   .append(getEname()).append("sal:").append(getSal());
   return buf.toString();}
   }

三、消息驅動的bean

消息驅動的bean(MDB)為實現異步通信提供了一種比使用直接的Java消息服務(JMS)更簡單的方法。MDB用於接收異步JMS消息。容器處理JMS隊列和主題所需的大部分設置進程。它把所有消息發送給相關的MDB。MDB允許J2EE應用程序發送異步消息,隨後這些消息由應用程序來處理。要把bean指定為MDB,需要實現javax.jms.MessageListener接口,並且用@MessageDriven注釋該bean。

消息驅動的bean示例如下:

import javax.ejb.MessageDriven; 
import javax.ejb.ActivationConfigProperty;
import javax.ejb.Inject;
import javax.jms.*;
import java.util.*;
import javax.ejb.TimedObject;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName="connectionFactoryJndiName",
 propertyValue="jms/TopicConnectionFactory"),
@ActivationConfigProperty(propertyName=
"destinationName", propertyValue="jms/myTopic"),
@ActivationConfigProperty(propertyName=
"destinationType", propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName=
"messageSelector", propertyValue="RECIPIENT = 'MDB'") } )
/** A simple Message-Driven Bean that listens to the configured JMS Queue or
Topic and gets notified via an * invocation of it's onMessage() method
when a message has been posted to the Queue or Topic.The bean
* prints the contents of the message. */
public class MessageLogger implements MessageListener, TimedObject
{
 @Inject javax.ejb.MessageDrivenContext mc;
 public void onMessage(Message message)
 { System.out.println("onMessage() - " + message);
 try
 {
 String subject = message.getStringProperty("subject");
 String inmessage = message.getStringProperty("message");
 System.out.println("Message received\n\tDate:" + new java.util.Date()
+ "\n\tSubject:" + subject + "\n\tMessage:" + inmessage + "\n");
 System.out.println("Creating Timer a single event timer");
 TimerService ts = mc.getTimerService();
 Timer timer = ts.createTimer(30000, subject);
 System.out.println("Timer created by MDB at:"
+ new Date(System.currentTimeMillis()) +" with info:"+subject); }
 catch (Throwable ex)
 { ex.printStackTrace(); }
}
 public void ejbTimeout(Timer timer)
 { System.out.println("EJB 3.0:Timer with MDB");
 System.out.println("ejbTimeout() called at:"
+ new Date(System.currentTimeMillis()));
 return; }
}

四、使用 EJB 3.0

EJB客戶端是訪問bean的應用程序。它不必位於客戶端層上,但可以是獨立的應用程序、Java服務器頁面(JSP)、服務器小程序或者另一個EJB。客戶端通過bean的遠程或本地接口來使用EJB的方法,遠程還是本地取決於客戶端是在同一個JVM裡面還是不同的JVM裡面。這些接口定義了bean的方法,而bean類負責實際實現這些方法。客戶端訪問bean類的方法時,容器就會為bean生成一個代理,名為遠程或者本地對象。遠程或者本地對象接收請求後,交給相應的bean實例,並將結果返回給客戶端。想調用bean的方法,客戶端需要通過使用EJB部署描述符(deployment descriptor)裡面定義的bean名稱來找到該bean。在以下的示例中,客戶端使用Context對象找到名為“Statelessejb”的bean。

EJB 客戶端示例如下:

import javax.naming.Context;
   import javax.naming.InitialContext;
   /* A simple bean client which calls methods on a stateless session bean.*/
   public class CalculateejbClient
   {
   public static void main(String [] args)
   {
   Context context = new InitialContext();
   CalculateEJB myejb =(CalculateEJB)context.lookup
   ("java:comp/env/ejb/CalculateEJB");
   myejb.incrementValue(); }
   }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved