暫時跳過JCA的冗長程式碼範例.距離我上一次使用EJB,已經有三年多了,還真久了阿。
作為一個Enterprise的系統必須能提供很完善且足以涵蓋所有需求考量的構面,所以至少得有以下這些服務存在著。
- Scalable service
- Available service
- Reliable service
- secure service
- Transaction service
- Distributed communication service
- Naming and Directory services
- Messaging service
- Data access
- Persistence service
- Resource sharing service
在分散式架構下,ejb的運作模式是從client端呼叫一個Business Object interface,用以取得遠端的實體business object的服務,這整體有套上了一組pattern( proxy ?),在cient端實際上是透過了包裝在BO interface上的 Stub(代理),而stub則發送訊息到遠端的BO instance上所包裝的(Tie / Skeleton),來進行實際程序呼叫與運作,最後才將處理結果傳回至client。
- JSR 220 - Enterprise JavaBean 3.0
ejb從1.0開始就一直被人詬病太複雜太難用,甚至是討人厭,JCP在後續的幾年當中進行了很多的努力,直至3.0現在有了幾個重要的改變
- Metadata annotations的支援,透過annotation標注方式減少其他的設定檔的設計
- 簡化ejb types,尤其是對於SessionBean 的 Home / Remote interface 可以完全不用寫,這令人感到高興,對於真正要提供服務的Business Object 可以完全轉成一個POJO了。
- 簡化entity Bean的設計,透過JPA仍可有輕量化的物件模型甚至還保留了繼承與多型的特性。
- 對於所有的Entity Beans從此不在需要實做任何interface
- 可透過annotation / xml DD 來宣告entity model之間的關係
- 強化了EJB QL,提供了一組更接近於Native SQL 的DDL操作。對於以前不支援的注入,inner , outter join , subquery,update , delete , group by 都更顯得出這次變更的決心...
- An interceptor facility for session beans and message-driven beans.
- 將以往Session Bean一定得override的 callback APIS 都給一併抹除了- ejbLoad , ejbStore , ejbPassivate, ejbActivate。
PS : annotation不是為了消滅萬惡的DD而來,這算是一種輔助性質的選擇,開發期間可以動態自行宣告設定,但最後要實行上線前,若有必要調整屬性,可以不需要改code,直接用DD的設定來override即可。
//進公司再補抓圖
- Required Classes / Interfaces Must be Provided for an EJB
雖然考試考的是ejb 3.0,但一併複習一下早期版本順便看看差異
- Home interface - EJBHome
- Remote interface - EJBObject
- XML Deployment Descriptor
- Bean class
- Context objects
先看到早期版本部份 1.0 - 2.x
- EJBHome - 提供了幾個method, create() , remove(), find() 來操作ejb ,client就是從JNDI開始來找到home,進而呼叫起home.create()。
- EJBObject - 基本上這個介面算是有點像功能註冊的概念,只要是要提更給client端呼叫的method都必須在這裡宣告,但謹記,這都是代理機制,從stub to skeleton...
- XML DD - 設定宣告
- Bean class -所有的business logic都放在這了,且必須完全有對應至EJBObject中宣告的程式,且必須繼承javax.ejb.SessionBean or javax.ejb.EntityBean。
- Context Object - 對於每一個還活著的sessionbean or entitybean,container會自動生出一個context綁定至其中,主要適用來維護此bean instance所使用,可透過此context判定狀態。(SessionContext / EntityContext),不管是EJB or EJB Container都是靠著這context來合作進行 交易控管,安全控管,資料物件實體化以及其他系統服務。
那麼時光來到了EJB 3.0之後事情又是如何的發展了呢? -- 很多事情都省略囉!!!
- Bean Class - 老樣子的BO , ex: class HelloBean
- Business Interface - 可透過直接在Bean interace 上註記為 @remote即可 , ex: interface IHelloBean
- XML DD - 不再是必要的檔案了,但可用於佈署前作override method usage 使用
- Distinguish between Session and Entity Beans
在EJB spec中有提到,支援兩種特性的物件實體 - transient , persistent。
transient表示不需要被保存的,像是sessionbean,而persistent則是常見的entity bean。
有一句話是這樣對SessionBean定義的: A session bean is an EJB that is created by a client and usually exist only for the duration of a single client/server session。
對於SessionBean 的管理,基本上在佈署階段時,Container就會自動的補上一些隱含的class榜定其中,Container會透過一個implements Serializable 的 Handle class來進行SessionBean 的life cycle control。
沒有留言:
張貼留言