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接口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.