EJB 3.0中会话Bean,实体Bean,消息驱动Bean的作用和例子
生活随笔
收集整理的這篇文章主要介紹了
EJB 3.0中会话Bean,实体Bean,消息驱动Bean的作用和例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關鍵詞:EJB 3.0,會話Bean,實體Bean,消息驅動Bean
EJB 3.0規范使開發EJB比過去更容易,可能誘惑你考慮開發第一個EJB。如果真是這種情況,那么祝賀你,你已經成功避免了在你以前EJB開發者的很多挫折,并且享受到EJB 3.0開發的便利性。但是你開始開發以前,你可能想知道EJB是什么和它們用于什么目的。本篇文章解釋了EJB的基礎和你如何在一個J2EE程序中使用它們。
什么是EJB?
一個企業JavaBean (EJB)是一個可重用的,可移植的J2EE組件。 EJB由封裝了業務邏輯的多個方法組成。例如,一個EJB可以有包括一個更新客戶數據庫中數據的方法的業務邏輯。多個遠程和本地客戶端可以調用這個方法。另外,EJB運行在一個容器里,允許開發者只關注與bean中的業務邏輯而不用考慮象事務支持,安全性和遠程對象訪問等復雜和容易出錯的事情。EJB以 POJO或者普通舊的Java對象形式開發,開發者可以用元數據注釋來定義容器如何管理這些Bean。
EJB類型
EJB主要有三種類型:會話Bean,實體Bean和消息驅動Bean。
會話Bean完成一個清晰的解耦的任務,例如檢查客戶賬戶歷史記錄。
實體Bean是一個代表存在于數據庫中業務對象的復雜業務實體。
消息驅動Bean用于接收異步JMS消息。讓我們更詳細的認識這些類型。
會話Bean
會話Bean一般代表著業務流程中象“處理訂單”這樣的動作。會話Bean基于是否維護過度狀態分為有狀態或者無狀態。
無狀態會話Bean沒有中間狀態。它們不保持追蹤一個方法調用另一個方法傳遞的信息。因此一個無狀態業務方法的每一次調用都獨立于它的前一個調用;例如,稅費計算或者轉移賬款。當計算稅費額的方法被調用時,稅費值被計算并返回給調用的方法,沒有必要存儲調用者為將來調用備用的內部狀態。因為它們不維護狀態,所以這些Bean是僅僅由容器管理。當客戶端請求一個無狀態的Bean實例時,它可以接收來自由容器管理的無狀態會話Bean實例集中的一個實例。也因為無狀態會話Bean能夠被共享,所以容器可以維護更少數量的實例來為大量的客戶端服務。簡單地象該Bean增加元注釋@Stateless 來指定一個 Java Bean作為一個無狀態會話Bean被部署和管理。
一個有狀態的會話Bean維護一個跨越多個方法調用的會話狀態;例如在線購物籃應用。當客戶開始在線購物時,客戶的詳細信息從數據庫獲得。相同的信息對于當客戶從購物籃中增加或者移除商品等等操作時被調用的其他方法也是可訪問的。但是因為該狀態不是在會話結束,系統崩潰或者網絡失敗時保留,所以有狀態會話Bean是暫時的。當一個客戶端請求一個有狀態會話Bean實例時,客戶端將會得到一個會話實例,該Bean的狀態只為給客戶端維持。通過向方法增加元注釋@Remove來告訴容器當某個方法調用結束一個有狀態會話Bean實例應該被移除。
會話Bean實例
Java代碼 ?import?javax.ejb.Stateless.*;?? ?? /**? *?一個簡單無狀態會話Bean實現了CalculateEJB接口的incrementValue()方法? **/?? ?? @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中所有沒有@Transient元注釋的變量需要考慮持久化。EJB3.0的一個主要特色是創建包含使用元數據注釋的對象/關系映射實體Bean的能力。例如,指定實體Bean的empId變量映射到employee表中的EMPNO屬性,象下面實例中一樣用@Table(name="Employees") 注釋這個表的名字和用@Column(name="EMPNO")注釋empId變量。另外,EJB3.0中的一個特色是你可以很容易的在開發時測試實體 Bean,可以用Oracle Application Server Entity Test Harness在容器外部運行一個實體Bean。
實體Bean實例
Java代碼 ?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應用發送異步消息,該應用能處理這些消息。實現javax.jms.MessageListener接口和使用@MessageDriven注釋該Bean來指定一個Bean是消息驅動Bean。
消息驅動Bean實例
Java代碼 ?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'")?? }?? )?? ?? /**? *監聽可配置JMS隊列或者主題和通過當一個消息發送到隊列或者主題? *調用它的onMessage()方法得到提醒的一個簡單的消息驅動? *該Bean打印消息的內容? */?? ?? 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
客戶端是訪問Bean的應用程序。雖然沒有必要保存在客戶層,但是能夠作為一個獨立的應用,JSP,Servlet,或者另一個EJB。客戶端通過Bean的遠程或者本地接口訪問EJB中的方法,主要取決于客戶端和Bean運行在同一個還是不同的JVM中。這些接口定義了Bean中的方法,而由Bean類實際實現這些方法。當一個客戶端訪問該Bean類中的一個方法時,容器生成Bean的一個代理,被叫做遠程對象或者本地對象。遠程或者本地對象接收請求,委派它到相應的Bean實例,返回結果給客戶端。調用一個Bean中的方法,客戶端使用定義在EJB不是描述文件的名字查找到Bean。在以下實例中,客戶端使用上下文對象找到命名為"StateLessejb" Bean。
EJB客戶端實例
Java代碼 ?import?javax.naming.Context;?? import?javax.naming.InitialContext;?? ?? /**? *?一個調用無狀態會話Bean中方法的簡單的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();?? }?? }??
EJB 3.0開發企業JavaBean是相當容易的。此規范使用元數據注釋定義Bean的類型和暴露給客戶端的方法。因此,無論你將創建一個執行特定任務的會話Bean還是映射一個表到實體Bean來更新數據,你都能象使用普通Java對象和接口一樣進行處理,在業務方法中使用元注釋向客戶端暴露方法。
EJB 3.0規范使開發EJB比過去更容易,可能誘惑你考慮開發第一個EJB。如果真是這種情況,那么祝賀你,你已經成功避免了在你以前EJB開發者的很多挫折,并且享受到EJB 3.0開發的便利性。但是你開始開發以前,你可能想知道EJB是什么和它們用于什么目的。本篇文章解釋了EJB的基礎和你如何在一個J2EE程序中使用它們。
什么是EJB?
一個企業JavaBean (EJB)是一個可重用的,可移植的J2EE組件。 EJB由封裝了業務邏輯的多個方法組成。例如,一個EJB可以有包括一個更新客戶數據庫中數據的方法的業務邏輯。多個遠程和本地客戶端可以調用這個方法。另外,EJB運行在一個容器里,允許開發者只關注與bean中的業務邏輯而不用考慮象事務支持,安全性和遠程對象訪問等復雜和容易出錯的事情。EJB以 POJO或者普通舊的Java對象形式開發,開發者可以用元數據注釋來定義容器如何管理這些Bean。
EJB類型
EJB主要有三種類型:會話Bean,實體Bean和消息驅動Bean。
會話Bean完成一個清晰的解耦的任務,例如檢查客戶賬戶歷史記錄。
實體Bean是一個代表存在于數據庫中業務對象的復雜業務實體。
消息驅動Bean用于接收異步JMS消息。讓我們更詳細的認識這些類型。
會話Bean
會話Bean一般代表著業務流程中象“處理訂單”這樣的動作。會話Bean基于是否維護過度狀態分為有狀態或者無狀態。
無狀態會話Bean沒有中間狀態。它們不保持追蹤一個方法調用另一個方法傳遞的信息。因此一個無狀態業務方法的每一次調用都獨立于它的前一個調用;例如,稅費計算或者轉移賬款。當計算稅費額的方法被調用時,稅費值被計算并返回給調用的方法,沒有必要存儲調用者為將來調用備用的內部狀態。因為它們不維護狀態,所以這些Bean是僅僅由容器管理。當客戶端請求一個無狀態的Bean實例時,它可以接收來自由容器管理的無狀態會話Bean實例集中的一個實例。也因為無狀態會話Bean能夠被共享,所以容器可以維護更少數量的實例來為大量的客戶端服務。簡單地象該Bean增加元注釋@Stateless 來指定一個 Java Bean作為一個無狀態會話Bean被部署和管理。
一個有狀態的會話Bean維護一個跨越多個方法調用的會話狀態;例如在線購物籃應用。當客戶開始在線購物時,客戶的詳細信息從數據庫獲得。相同的信息對于當客戶從購物籃中增加或者移除商品等等操作時被調用的其他方法也是可訪問的。但是因為該狀態不是在會話結束,系統崩潰或者網絡失敗時保留,所以有狀態會話Bean是暫時的。當一個客戶端請求一個有狀態會話Bean實例時,客戶端將會得到一個會話實例,該Bean的狀態只為給客戶端維持。通過向方法增加元注釋@Remove來告訴容器當某個方法調用結束一個有狀態會話Bean實例應該被移除。
會話Bean實例
Java代碼 ?
實體Bean
實體Bean是管理持久化數據的一個對象,潛在使用一些相關的Java對象并且可以依靠主鍵被唯一識別。通過包括@Entity元注釋來指定一個類是一個實體Bean。實體Bean表示來自數據庫的持久化數據,例如客戶表中的一個記錄,或者一個員工表中的一個員工記錄。實體Bean也可以被多個客戶端共享。例如一個員工實體能夠被多個計算一個員工每年工資總額或者更新員工地址的客戶端使用。實體Bean對象特定變量能夠保持持久化。實體Bean中所有沒有@Transient元注釋的變量需要考慮持久化。EJB3.0的一個主要特色是創建包含使用元數據注釋的對象/關系映射實體Bean的能力。例如,指定實體Bean的empId變量映射到employee表中的EMPNO屬性,象下面實例中一樣用@Table(name="Employees") 注釋這個表的名字和用@Column(name="EMPNO")注釋empId變量。另外,EJB3.0中的一個特色是你可以很容易的在開發時測試實體 Bean,可以用Oracle Application Server Entity Test Harness在容器外部運行一個實體Bean。
實體Bean實例
Java代碼 ?
消息驅動Bean
驅動Bean (MDB) 提供了一個實現異步通信比直接使用Java消息服務(JMS)更容易地方法。創建MDB接收異步JMS消息。容器處理為JMS隊列和主題所要求加載處理的大部分工作。它向相關的MDB發送所有的消息。一個MDB允許J2EE應用發送異步消息,該應用能處理這些消息。實現javax.jms.MessageListener接口和使用@MessageDriven注釋該Bean來指定一個Bean是消息驅動Bean。
消息驅動Bean實例
Java代碼 ?
使用EJB
客戶端是訪問Bean的應用程序。雖然沒有必要保存在客戶層,但是能夠作為一個獨立的應用,JSP,Servlet,或者另一個EJB。客戶端通過Bean的遠程或者本地接口訪問EJB中的方法,主要取決于客戶端和Bean運行在同一個還是不同的JVM中。這些接口定義了Bean中的方法,而由Bean類實際實現這些方法。當一個客戶端訪問該Bean類中的一個方法時,容器生成Bean的一個代理,被叫做遠程對象或者本地對象。遠程或者本地對象接收請求,委派它到相應的Bean實例,返回結果給客戶端。調用一個Bean中的方法,客戶端使用定義在EJB不是描述文件的名字查找到Bean。在以下實例中,客戶端使用上下文對象找到命名為"StateLessejb" Bean。
EJB客戶端實例
Java代碼 ?
EJB 3.0開發企業JavaBean是相當容易的。此規范使用元數據注釋定義Bean的類型和暴露給客戶端的方法。因此,無論你將創建一個執行特定任務的會話Bean還是映射一個表到實體Bean來更新數據,你都能象使用普通Java對象和接口一樣進行處理,在業務方法中使用元注釋向客戶端暴露方法。
總結
以上是生活随笔為你收集整理的EJB 3.0中会话Bean,实体Bean,消息驱动Bean的作用和例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL 反模式
- 下一篇: 为什么要使用EJB?