EJB 企業級應用的架構(2)





SessionBean






SessionBean接受客戶端的請求,並作出響應,是商業過程處理對象。






無狀態SessionBean(Statless)






無狀態Session是可以被重用,不能被客戶端併發共享,只可以串行共享,並不保留客戶端方法調用後的的狀態,而是直接返回。


無狀態的SessionBean是可以池化的,以優化性能。






無狀態SessionBean的生命週期






如果實例不存在,就會調用構造方法,然後調用資源注入方法,接着會調用有@PostConstruct標註的方法,在銷燬時會調用有@PerDestroy標註的方法,然後銷燬對象,如果實例存在就會從Bean實例池中取出實例並調用方法。






回調方法是基於事件機制的。






生命週期回調方法的規則


1,對於直接定義在Bean中的回調,其格式應該是public void <method()>,也就是直接寫在SessionBean中。


2,對於爲Bean類單獨提供(單個或多個)回調監聽而言。其格式是public void <method(InvocationContext context)>


java.interceptor.InvocationContext,提供了調用的上下文信息。只在SessionBean類上加上@Interceptors(Xxxx.class)制定定義了回調方法的類。


3,回調方法不能夠拋出已檢查異常,但可以拋運行時異常。


 


在創建實例並注入資源之後,會回調這個方法。


@PostConstruct


public void constructed(){}






在銷燬對象時回調這個方法


@PerDestroy


public void destroy(){}






有狀態的SessionBean(Statful)






有狀態的SessionBean只爲一個客戶端服務,不能共享,並且會保留方法調用後的狀態。






當有狀態的SessionBean暫時不被使用時,就會被存儲到緩存當中,也就是被存到虛擬內存或者是將信息同步到Session數據庫中(Session數據庫是應用服務器所提共的小型數據庫,用來保存Session的信息,多應用服務器共享Session數據庫,同步Bean的信息,達到集羣處理)。






swap out passivation鈍化過程,保存SessionBean的狀態,在SessionBean處在事務中時是不會進行鈍化的。


swap in activation激活過程,提取保存的SessionBean到內存中,可以繼續被客戶端使用。






有狀態的Session,會保存成員變量(沒有加transient關鍵字,以及串行化的類型和基本類型),也會保存其他的SessionBean的引用。






對有狀態的SessionBean中有transient屬性時,就需要在Bean中提供激活的方法也就是


@Statful


Test implements TestRemote{


   transient private int a;


   @PostActivate


   public void activate(){


a=5;


   }


}






在SessionBean中實現事務處理時要實現SessionSynchronization接口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章