
- EJB 教程
- EJB - 首頁
- EJB - 概述
- EJB - 環境設定
- EJB - 建立應用程式
- EJB - 無狀態 Bean
- EJB - 有狀態 Bean
- EJB - 持久化
- EJB - 訊息驅動 Bean
- EJB - 註解
- EJB - 回撥
- EJB - 定時器服務
- EJB - 依賴注入
- EJB - 攔截器
- EJB - 可嵌入物件
- EJB - Blobs/Clobs
- EJB - 事務
- EJB - 安全性
- EJB - JNDI 繫結
- EJB - 實體關係
- EJB - 訪問資料庫
- EJB - 查詢語言
- EJB - 異常處理
- EJB - Web 服務
- EJB - 打包應用程式
- EJB 有用資源
- EJB - 快速指南
- EJB - 有用資源
- EJB - 討論
EJB - 面試問題
尊敬的讀者,這些EJB 3.0 面試問題是專門為了讓您熟悉在EJB 3.0主題的面試中可能遇到的問題型別而設計的。根據我的經驗,優秀的 interviewers 很少會在面試前計劃要問哪些具體問題,通常問題會從主題的一些基本概念開始,然後根據進一步的討論以及您的回答繼續下去。
EJB 代表 Enterprise Java Beans。EJB 是 J2EE 平臺的重要組成部分。J2EE 平臺具有基於元件的架構,為企業級應用程式提供多層、分散式和高事務性功能。
EJB 提供了一種架構來開發和部署基於元件的企業應用程式,同時考慮了健壯性、高可擴充套件性和高效能。EJB 應用程式可以部署在任何符合 J2EE 1.3 標準規範的應用程式伺服器上。
以下是 EJB 的主要優勢。
簡化大型企業級應用程式的開發。
應用程式伺服器/EJB 容器提供大多數系統級服務,例如事務處理、日誌記錄、負載平衡、持久化機制、異常處理等等。開發人員只需專注於應用程式的業務邏輯。
EJB 容器管理 ejb 例項的生命週期,因此開發人員無需擔心何時建立/刪除 ejb 物件。
Session Bean 儲存特定使用者的會話資料。它可以是有狀態的或無狀態的。與實體 Bean 相比,它佔用較少的資源。Session Bean 在使用者會話終止後立即被銷燬。
有狀態 Session Bean 是一種企業 Bean,它保留與客戶端的會話狀態。顧名思義,有狀態 Session Bean 會在其例項變數中儲存關聯的客戶端狀態。EJB 容器為每個客戶端請求建立一個單獨的有狀態 Session Bean 來處理。一旦請求範圍結束,有狀態 Session Bean 就會被銷燬。
無狀態 Session Bean 是一種企業 Bean,通常用於執行獨立操作。顧名思義,無狀態 Session Bean 沒有與任何客戶端狀態關聯,但它可以保留其例項狀態。EJB 容器通常建立少量無狀態 Bean 物件的池,並使用這些物件來處理客戶端請求。由於池的存在,例項變數的值在查詢/方法呼叫之間並不保證相同。
實體 Bean 表示永續性資料儲存。使用者資料可以透過實體 Bean 儲存到資料庫,然後可以從實體 Bean 中檢索資料庫中的資料。
訊息驅動 Bean 是一種企業 Bean,當它從佇列或主題接收訊息時,由 EJB 容器呼叫。訊息驅動 Bean 是一個無狀態 Bean,用於非同步執行任務。
如果 ejb 客戶端與要部署 ejb Session Bean 的環境相同,則我們使用本地 Session Bean。
如果 ejb 客戶端與要部署 ejb Session Bean 的環境不同,則我們使用遠端 Session Bean。
以下是有狀態 Session Bean 和無狀態 Session Bean 之間的區別
EJB 容器為每個客戶端請求建立一個單獨的有狀態 Session Bean 來處理。而 EJB 容器通常建立少量無狀態 Bean 物件的池,並使用這些物件來處理客戶端請求。
一旦請求範圍結束,有狀態 Session Bean 就會被銷燬,但無狀態 Bean 保持活動狀態。
有狀態 Session Bean 是一種企業 Bean,它保留與客戶端的會話狀態。顧名思義,有狀態 Session Bean 會在其例項變數中儲存關聯的客戶端狀態。而由於無狀態 Session Bean 的池的存在,在無狀態 Session Bean 中,例項變數的值在查詢/方法呼叫之間並不保證相同。
以下是 EJB 中持久化 API 的關鍵元件
實體 - 表示資料儲存記錄的持久物件。最好是可序列化的。
實體管理器 - 持久化介面,用於對持久物件(實體)執行新增/刪除/更新/查詢等資料操作。它還有助於使用 Query 介面執行查詢。
持久化單元 (persistence.xml) - 持久化單元描述了持久化機制的屬性。
資料來源 (*ds.xml) - 資料來源描述了資料儲存相關的屬性,例如連線 URL、使用者名稱、密碼等。
訊息驅動 Bean 是一個無狀態 Bean,用於非同步執行任務。
@javax.ejb.Stateless 註解指定給定的 ejb 類是無狀態 Session Bean。以下是其屬性
name - 用於指定 Session Bean 的名稱。
mappedName - 用於指定 Session Bean 的 JNDI 名稱。
description - 用於提供 Session Bean 的描述。
@javax.ejb.Stateful 註解指定給定的 ejb 類是有狀態 Session Bean。以下是其屬性
name - 用於指定 Session Bean 的名稱。
mappedName - 用於指定 Session Bean 的 JNDI 名稱。
description - 用於提供 Session Bean 的描述。
@javax.ejb.MessageDrivenBean 註解指定給定的 ejb 類是訊息驅動 Bean。以下是其屬性:name - 用於指定訊息驅動 Bean 的名稱。messageListenerInterface - 用於指定訊息驅動 Bean 的訊息偵聽器介面。activationConfig - 用於指定訊息驅動 Bean 在其操作環境中的配置詳細資訊。mappedName - 用於指定訊息驅動 Bean 的 JNDI 名稱。description - 用於提供訊息驅動 Bean 的描述。
@javax.ejb.EJB 註解用於將依賴項作為 ejb 例項注入到另一個 ejb 中。以下是其屬性
name - 用於指定將在環境中用於定位引用 Bean 的名稱。
beanInterface - 用於指定引用 Bean 的介面型別。
beanName - 用於提供引用 Bean 的名稱。
mappedName - 用於指定引用 Bean 的 JNDI 名稱。
description - 用於提供引用 Bean 的描述。
@javax.ejb.Local 註解用於指定 Session Bean 的本地介面。此本地介面宣告 Session Bean 的業務方法(可以是無狀態或有狀態的)。
此介面用於向在與 EJB 相同的部署/應用程式中執行的本地客戶端公開業務方法。
以下是其屬性
value - 用於指定本地介面列表,作為介面陣列。
@javax.ejb.Remote 註解用於指定 Session Bean 的遠端介面。此遠端介面宣告 Session Bean 的業務方法(可以是無狀態或有狀態的)。
此介面用於向在與 EJB 不同的部署/應用程式中執行的遠端客戶端公開業務方法。
以下是其屬性
value - 用於指定遠端介面列表,作為介面陣列。
@javax.ejb.ActivationConfigProperty 註解用於指定訊息驅動 Bean 所需的屬性。例如端點、目標、訊息選擇器等。
此註解作為引數傳遞給 javax.ejb.MessageDrivenBean 註解的 activationConfig 屬性。以下是其屬性
propertyName - 屬性的名稱。
propertyValue - 屬性的值。
@javax.ejb.PostActivate 註解用於指定 ejb 生命週期回撥方法。當 EJB 容器啟用/重新啟用 Bean 例項時,將呼叫此方法。
此介面用於向在與 EJB 相同的部署/應用程式中執行的本地客戶端公開業務方法。
回撥是一種機制,可以透過它攔截企業 Bean 的生命週期。EJB 3.0 規範指定了要為其建立回撥處理程式方法的回撥。EJB 容器呼叫這些回撥。我們可以在 ejb 類本身或單獨的類中定義回撥方法。EJB 3.0 提供了許多用於回撥的註解。
以下是無狀態 Bean 的回撥註解列表
@PostConstruct - 當第一次建立 Bean 時呼叫該方法。
@PreDestroy - 當 Bean 從 Bean 池中移除或被銷燬時呼叫該方法。
以下是有狀態 Bean 的回撥註解列表
@PostConstruct - 當第一次建立 Bean 時呼叫該方法。
@PreDestroy - 當 Bean 從 Bean 池中移除或被銷燬時呼叫該方法。
@PostActivate - 當載入 Bean 以供使用時呼叫該方法。
@PrePassivate - 當將 Bean 放回 Bean 池時呼叫該方法。
以下是訊息驅動 Bean 的回撥註解列表
@PostConstruct - 當第一次建立 Bean 時呼叫該方法。
@PreDestroy - 當 Bean 從 Bean 池中移除或被銷燬時呼叫該方法。
以下是實體 Bean 的回撥註解列表
@PrePersist - 當在資料庫中建立實體時呼叫該方法。
@PostPersist - 方法在實體建立到資料庫後被呼叫。
@PreRemove - 方法在實體從資料庫中刪除之前被呼叫。
@PostRemove - 方法在實體從資料庫中刪除後被呼叫。
@PreUpdate - 方法在實體即將更新到資料庫之前被呼叫。
@PostLoad - 方法在記錄從資料庫中獲取並載入到實體時被呼叫。
計時器服務是一種機制,可以使用它來構建計劃應用程式。例如,每月1日生成工資單。EJB 3.0 規範指定了 @Timeout 註解,它有助於以無狀態或訊息驅動 Bean 的方式對 ejb 服務進行程式設計。EJB 容器呼叫用 @Timeout 註解的方法。
EJB 計時器服務是由 Ejb 容器提供的服務,它有助於建立計時器並在計時器到期時安排回撥。
@EJB 註解用於注入其他 EJB 的引用。
@Resource 註解用於將資料來源注入到 ejb 中。
@Resource 註解用於將單例服務(如計時器服務)注入到 ejb 中。
@Resource 註解用於將 SessionContext 注入到 ejb 中。
EJB 3.0 規範提供了註解,這些註解可以應用於欄位或 setter 方法以注入依賴項。EJB 容器使用全域性 JNDI 登錄檔來查詢依賴項。
EJB 3.0 提供了規範,可以使用用 @AroundInvoke 註解的方法來攔截業務方法呼叫。攔截器方法在 ejbContainer 呼叫其攔截的業務方法之前被呼叫。
類級攔截器會為 Bean 的每個方法呼叫。類級攔截器可以透過註解或透過 xml(ejb-jar.xml)應用。
預設攔截器會為部署中的每個 Bean 呼叫。預設攔截器只能透過 xml(ejb-jar.xml)應用。
方法級攔截器會為 Bean 的特定方法呼叫。方法級攔截器可以透過註解或透過 xml(ejb-jar.xml)應用。
EJB 3.0 提供了將 JAVA POJO(普通舊 Java 物件)嵌入到實體 Bean 中的選項,並允許將列名與嵌入 POJO 類的 方法進行對映。要嵌入的 Java POJO 必須用 @Embeddable 進行註解。
EJB 3.0 使用 @Lob 註解支援 Blob 和 Clob 型別。
可以使用 @Lob 註解對映以下 Java 型別
java.sql.Blob
java.sql.Clob
byte[]
String
可序列化物件
事務是一組遵循 ACID 屬性的工作項。ACID 代表原子性、一致性、隔離性和永續性。
ACID 代表原子性、一致性、隔離性和永續性。
原子性 - 如果任何工作項失敗,則整個單元都被視為失敗。成功意味著所有專案都成功執行。
一致性 - 事務必須使系統保持一致狀態。
隔離性 - 每個事務獨立於任何其他事務執行。
永續性 - 如果事務已執行或提交,則事務應在系統故障後仍然存在。
在這種型別中,容器管理事務狀態。
在這種型別中,開發人員管理事務狀態的生命週期。
EJB 3.0 指定了以下事務屬性,EJB 容器實現這些屬性
REQUIRED - 指示業務方法必須在事務中執行,否則將為該方法啟動一個新事務。
REQUIRES_NEW - 指示為業務方法啟動一個新事務。
SUPPORTS - 指示業務方法將作為事務的一部分執行。
NOT_SUPPORTED - 指示業務方法不應作為事務的一部分執行。
MANDATORY - 指示業務方法將作為事務的一部分執行,否則將丟擲異常。
NEVER - 指示如果業務方法作為事務的一部分執行,則將丟擲異常。
在 Bean 管理的事務中,可以透過在應用程式級別處理異常來管理事務。以下是要考慮的關鍵點
開始 - 何時在業務方法中啟動事務。
成功 - 識別事務要提交時的成功場景。
失敗 - 識別事務要回滾時的失敗場景。
EJB 3.0 指定了以下安全屬性/註解,EJB 容器實現這些屬性
DeclareRoles - 指示類將接受那些宣告的角色。註解應用於類級別。
RolesAllowed - 指示方法可以被指定角色的使用者訪問。可以應用於類級別,從而導致類中的所有方法都可以被指定角色的使用者訪問。
PermitAll - 指示業務方法對所有人開放。可以應用於類級別和方法級別。
DenyAll - 指示業務方法對任何在類級別或方法級別指定的 使用者都不可訪問。
JNDI 代表 Java Naming and Directory Interface(Java 命名和目錄介面)。它是一組 API 和服務介面。基於 Java 的應用程式使用 JNDI 進行命名和目錄服務。在 EJB 的上下文中,有兩個術語
繫結 - 這指的是為 ejb 物件分配一個名稱,以後可以使用該名稱。
查詢 - 這指的是查詢和獲取 ejb 的物件。
EJB 3.0 提供了定義資料庫實體關係/對映(如一對一、一對多、多對一和多對多關係)的選項。以下是相關的註解
OneToOne - 物件具有一對一關係。例如,乘客一次可以使用一張票旅行。
OneToMany - 物件具有一對多關係。例如,父親可以有多個孩子。
ManyToOne - 物件具有多對一關係。例如,多個孩子有一個母親。
ManyToMany - 物件具有多對多關係。例如,一本書可以有多個作者,一個作者可以寫多本書。
在 EJB 3.0 中,ejb 查詢語言非常方便編寫自定義查詢,而無需擔心底層資料庫的細節。它與 HQL(Hibernate 查詢語言)非常相似,通常被稱為 EJBQL。
如果違反業務規則或在執行業務邏輯時發生異常。那麼 EJB 容器將其視為應用程式級異常。
任何不是由業務邏輯或業務程式碼引起的異常。RuntimeException、RemoteException 是 SystemException。例如,在 ejb 查詢期間發生的錯誤。那麼 EJB 容器會將此類異常視為系統級異常。
當發生應用程式異常時,ejb 容器會攔截異常,但將其原樣返回給客戶端。它不會回滾事務,除非 EJBContext.setRollBackOnly() 方法在程式碼中指定。EJB 容器在應用程式異常情況下不會包裝異常。
當發生系統異常時,ejb 容器會攔截異常,回滾事務並啟動清理任務。它會將異常包裝到 RemoteException 中並將其拋給客戶端。
下一步是什麼?
接下來,您可以回顧您之前完成的與該主題相關的作業,並確保您能夠自信地談論它們。如果您是應屆畢業生,面試官不會期望您能回答非常複雜的問題,而是您必須使自己的基礎概念非常牢固。
其次,如果您無法回答一些問題,這並不重要,重要的是您回答的任何問題都必須充滿自信。所以在面試時要有自信。我們在 tutorialspoint 祝您面試順利,並祝您未來的事業一切順利。乾杯 :-)