循速漸進學用SessionBean(四)
Session Bean要求、限制和許可
在EJB規范中,對Session Bean有一些限制和要求。這些限制會指出哪些是bean必須做的,哪些是不能做的,以及bean必須實現的一些方法和接口。也有一些規范指出哪些處理是允許做的,這是為了避免你以為這些處理是被其它限制禁止的。
實現SessionBean接口
session bean必須實現javax.ejb.SessionBean接口
聲明該類為Public,而不是Final或者Abstract
要記住EJB容器需要創建bean實例,因此該類必須是public,而且不是抽象的。
創建一個Pubic,無參數的構造器
同樣,由于EJB容器必須創建bean的實例。如果構造器是protected或者private,容器就不能創建實例。
不要實現finalize方法
雖然你很少需要定義一個finalize方法,不過EJB規范中還是明文禁止在session和entity bean中定義finalize方法。如果你的bean需要做任何清除的操作,它們應該在ejbRemove或者ejbPassivate方法中進行。
實現create方法和所有的remote方法
一個session bean必須實現Home接口中指定的全部create方法,以及Remote接口中指定的全部方法。在實現這些方法時,有一些額外的要求:
. 這些方法必須是public,而不能是static或者final
. 參數和返回的類型必須是有效的RMI/IIOP返回類型。在通常的情況下,這意味著必須是原有的類型(int, char, double等),可串行化的對象或者Remote接口。
. 方法名不能以ejb開頭(這將令EJB的配置工具感到迷惑,并且可能帶來沖突)
可選擇的實現Remote接口
對于一個bean可以實現Remote接口,這個特性也是挺重要的。在實現類中,其中的方法簽名必須和Reomote接口中的一樣,除了一點,就是實現類中的方法并不拋出RemoteException。也就是說,雖然對于Remote接口的每個方法,在實現類中都必須要有相應的方法對應,而且不需要作如下的聲明:
public class ShoppingCartImpl implements SessionBean, ShoppingCart
實現Remote接口的原因是:在漏掉一個方法時編譯器將會告訴你,也就是說,如果沒有實現Remote接口中的一個方法,編譯器將會產生一個錯誤。否則,你將不知道漏掉了一個方法,直到你運行一個配置工具或者是打包工具為止。越遲發現錯誤,就要花越長的時間來改正它。
在實現Remote接口時,可能會遇到的問題是使用this關鍵字來傳送對象,而不是使用session context中的getEJBObject方法。通常,當使用this而不是getEJBObject時,編譯器將會產生一個錯誤,因為它期待一個實現Remote接口的對象,而實現類卻這樣做。通過實現Remote接口,你通過了編譯,但是你在運行時又碰到了錯誤,這是由于與EJB容器期待的不同,實現類并不是一個到Remote接口的正確引用。
提示
雖然實現Remote接口可以指出在編譯時的錯誤,但是這樣也會導致出現一些直到運行時才會發現的錯誤,令修改起來很費時間。所以你最好不要實現Remote接口,而在配置時發現一些錯誤。
在EJB規范中,對Session Bean有一些限制和要求。這些限制會指出哪些是bean必須做的,哪些是不能做的,以及bean必須實現的一些方法和接口。也有一些規范指出哪些處理是允許做的,這是為了避免你以為這些處理是被其它限制禁止的。
實現SessionBean接口
session bean必須實現javax.ejb.SessionBean接口
聲明該類為Public,而不是Final或者Abstract
要記住EJB容器需要創建bean實例,因此該類必須是public,而且不是抽象的。
創建一個Pubic,無參數的構造器
同樣,由于EJB容器必須創建bean的實例。如果構造器是protected或者private,容器就不能創建實例。
不要實現finalize方法
雖然你很少需要定義一個finalize方法,不過EJB規范中還是明文禁止在session和entity bean中定義finalize方法。如果你的bean需要做任何清除的操作,它們應該在ejbRemove或者ejbPassivate方法中進行。
實現create方法和所有的remote方法
一個session bean必須實現Home接口中指定的全部create方法,以及Remote接口中指定的全部方法。在實現這些方法時,有一些額外的要求:
. 這些方法必須是public,而不能是static或者final
. 參數和返回的類型必須是有效的RMI/IIOP返回類型。在通常的情況下,這意味著必須是原有的類型(int, char, double等),可串行化的對象或者Remote接口。
. 方法名不能以ejb開頭(這將令EJB的配置工具感到迷惑,并且可能帶來沖突)
可選擇的實現Remote接口
對于一個bean可以實現Remote接口,這個特性也是挺重要的。在實現類中,其中的方法簽名必須和Reomote接口中的一樣,除了一點,就是實現類中的方法并不拋出RemoteException。也就是說,雖然對于Remote接口的每個方法,在實現類中都必須要有相應的方法對應,而且不需要作如下的聲明:
public class ShoppingCartImpl implements SessionBean, ShoppingCart
實現Remote接口的原因是:在漏掉一個方法時編譯器將會告訴你,也就是說,如果沒有實現Remote接口中的一個方法,編譯器將會產生一個錯誤。否則,你將不知道漏掉了一個方法,直到你運行一個配置工具或者是打包工具為止。越遲發現錯誤,就要花越長的時間來改正它。
在實現Remote接口時,可能會遇到的問題是使用this關鍵字來傳送對象,而不是使用session context中的getEJBObject方法。通常,當使用this而不是getEJBObject時,編譯器將會產生一個錯誤,因為它期待一個實現Remote接口的對象,而實現類卻這樣做。通過實現Remote接口,你通過了編譯,但是你在運行時又碰到了錯誤,這是由于與EJB容器期待的不同,實現類并不是一個到Remote接口的正確引用。
提示
雖然實現Remote接口可以指出在編譯時的錯誤,但是這樣也會導致出現一些直到運行時才會發現的錯誤,令修改起來很費時間。所以你最好不要實現Remote接口,而在配置時發現一些錯誤。