天天看點

EJB注釋-1(EJB學習筆記)

 EJB注釋是EJB技術的一個特點。EJB的大部分功能都是通過注釋@來實作的。

EJB注釋

1. 有狀态@Stateful和無狀态@Stateless會話

@Stateless定義本會話為無狀态會話。無狀态會話Bean 是一個簡單的POJO(純粹的面向對象思想的java 對象),EJB3.0 容器自動地執行個體化及管理這個Bean。Stateless Session Bean不負責記錄使用者狀态,Stateless Session Bean一旦執行個體化就被加進會話池中,各個使用者都可以共用。即使使用者已經消亡,Stateless Session Bean的生命期也不一定結束,它可能依然存在于會話池中,供其他使用者調用。

@Stateful定義本會話為有狀态會話。有狀态Bean是一個可以維持自身狀态的會話Bean。每個使用者都有自己的一個執行個體,在使用者的生存期内,Stateful Session Bean 保持了使用者的資訊,即“有狀态”;一旦使用者滅亡(調用結束或執行個體結束),Stateful Session Bean的生命期也告結束。

一個bean可以同時是有狀态的和無狀态的

2. Local接口@Local和Remote接口@Remote

當@Local和@Remote注釋都不存在時,會話 Bean實作的接口預設為Local接口。如果在本機調

用EJB(確定用戶端與EJB容器運作在同一個JVM),采用Local接口通路EJB優于Remote接口,因為Remote

接口通路EJB需要經過遠端方法調用(RPCs)環節,而Local接口通路EJB直接從JVM 中傳回EJB的引用。

3. JNDI的命名規則

JNDI 名的組成規則是“上層名稱/下層名稱“,每層之間以”/”分隔。預設的JNDI名稱是 會話Bean +接口類型

4.改變Session Bean 的JNDI 名稱

要自定義JNDI名稱,可以使用@LocalBinding 和 @RemoteBinding 注釋,@LocalBinding注釋指定Session Bean的Local接口的JNDI名稱,@RemoteBinding注釋指定Session Bean的Remote接口的JNDI名稱。例如:

EJB注釋-1(EJB學習筆記)

@RemoteBinding (jndiBinding = "com /RemoteHello " )

EJB注釋-1(EJB學習筆記)

@LocalBinding (jndiBinding = " com/Local Hello " )

第一句定義JNDI 為com /RemoteHello,第二句 定義JNDI 為com/Local Hello

5. Bean 的生命周期

@PostConstruct:當bean對象完成執行個體化後,使用了這個注釋的方法會被立即調用。這個注釋同時适用于有狀态和無狀态的會話bean。

·@PreDestroy:使用這個注釋的方法會在容器從它的對象池中銷毀一個無用的或者過期的bean 執行個體之前調用。這個注釋同時适用于有狀态和無狀态的會話bean。

·@PrePassivate:當一個有狀态的session bean執行個體空閑過長的時間,容器将會鈍化(passivate)它,并把它的

狀态儲存在緩存當中。使用這個注釋的方法會在容器鈍化bean執行個體之前調用。這個注釋适用于有狀态的會話bean。

當鈍化後,又經過一段時間該bean 仍然沒有被操作,容器将會把它從存儲媒體中删除。以後,任何針對該bean

方法的調用容器都會抛出例外。

·@PostActivate:當用戶端再次使用已經被鈍化的有狀态session bean時,新的執行個體被建立,狀态被恢複。使用此注釋的session bean會在bean的激活完成時調用。這個注釋隻适用于有狀态的會話bean。

·@Init:這個注釋指定了有狀态session bean初始化的方法。它差別于@PostConstruct注釋在于:多個@Init注釋方法可以同時存在于有狀态session bean 中,但每個bean執行個體隻會有一個@Init注釋的方法會被調用。這取

決于bean是如何建立的(細節請看EJB 3.0規範)。@PostConstruct在@Init之後被調用。另一個有用的生命周期方法注釋是@Remove,特别是對于有狀态session bean。當應用通過存根對象調用使用了

@Remove注釋的方法時,容器就知道在該方法執行完畢後,要把bean執行個體從對象池中移走。

6. 攔截器(Interceptor)

攔截器可以監聽程式的一個或所有方法。攔截器對方法調用流提供了細粒度控制。

@Interceptors 注釋指定一個或多個在外部類中定義的攔截器。

@AroundInvoke 注釋指定了要用作攔截器的方法。用@AroundInvoke注釋指定的方法必須遵守以下格式:

public Object XXX(InvocationContext ctx) throws Exception。XXX 代表方法名可以任意。(以下同)

除了可以在外部定義攔截器之外,還可以将Session Bean 中的一個或多個方法定義為攔截器。

7. 依賴注入

為了存取那些服務對象,你需要通過伺服器的JNDI 來查找存根對象(session bean)或消息隊列(MDB)。JNDI查找是把用戶端與實際的服務端實作解藕的關鍵步驟。但是,直接使用一個字元串來進行JNDI查找并不優雅。

@EJB注釋EJB存根對象注入到任何EJB 3.0容器管理的POJO 中。

EJB注釋-1(EJB學習筆記)

@EJB (beanName = " HelloWorldBean " )

EJB注釋-1(EJB學習筆記)

// @EJB (mappedName="HelloWorldBean/remote")

beanName 的beanName屬性指定EJB的類名,mappedName指定Bean執行個體的JNDI名。

@EJB注釋如果被用在JavaBean風格的setter 方法上時,容器會在屬性第一次使用之前,自動地用正确的參數調用bean的setter 方法。

@EJB注釋隻能注入EJB存根對象,除@EJB注釋之外,EJB 3.0也支援@Resource注釋來注入來自JNDI的任何

資源。

如果JNDI對象在本地(java:comp/env)JNDI目錄中,你隻需給定他的映謝名稱即可,不需要帶字首。

@Resource注釋可以不指定JNDI名就能注入他們,他通過變量的類型就能獲得他的JNDI名。@Resource注釋可以被用在JavaBean風格的setter 方法上。

8. 定時服務

定時服務用作在一段特定的時間後執行某段程式,使用@Timeout 注釋聲明定時器方法。

通過依賴注入@Resource SessionContext ctx,獲得SessionContext對象,調用ctx.getTimerService().createTimer(Date arg0, long arg1, Serializable arg2)方法建立定時器,三個參數的含義如下:

Date arg0 定時器啟動時間,如果傳入時間小于現在時間,定時器會立刻啟動。

long arg1 間隔多長時間後再次觸發定時事件。機關:毫秒

當定時器建立完成後,還需聲明定時器方法。定時器方法必

EJB注釋-1(EJB學習筆記)

void  XXX(Timer timer)

待續