自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Eclipse+JBoss+EJB3攔截器方法和攔截器類

開發(fā) 后端
本文講述Eclipse+JBoss+EJB3攔截器方法和攔截器類。EJB3可以通過攔截器對Bean方法進(jìn)行攔截和覆蓋。有一些攔截器方法會(huì)攔截器不同Bean中的方法,在這種情況下,需要將攔截器方法放在一個(gè)單獨(dú)的類中。這個(gè)類就叫攔截器類。

一、攔截器方法

EJB3可以通過攔截器對Bean方法進(jìn)行攔截和覆蓋。這有些象AOP中的around。通過AOP的around方法,可以修改被攔截方法的返回值、參數(shù)值,甚至可以取消被攔截方法的執(zhí)行。EJB3的攔截器可以用在無狀態(tài)Session Bean、有狀態(tài)Session Bean和消息驅(qū)動(dòng)Bean(MDB)的方法中。實(shí)現(xiàn)攔截器的最簡單的方法是使用攔截器方法。也就是說,只要在當(dāng)前的Bean中使用@AroundInvoke對某個(gè)方法進(jìn)行注釋(關(guān)于攔截器的類都在javax.interceptor包中),那么這個(gè)方法就會(huì)變成攔截器方法,該攔截器方法會(huì)攔截當(dāng)前Bean中的所有方法。實(shí)現(xiàn)過程如下:

  1. @Stateful 
  2. public class GreeterBean implements Greeter  
  3. {  
  4.     @AroundInvoke 
  5.     public Object myInterceptorMethod1(InvocationContext ic) throws Exception  
  6.     {  
  7.         System.out.println("myInterceptorMethod1:" + ic.getMethod().getName());  
  8.         obj = ic.proceed();      
  9.     }  
  10.     @AroundInvoke 
  11.     public Object myInterceptorMethod2(InvocationContext ic) throws Exception  
  12.     {  
  13.         System.out.println("myInterceptorMethod2:" + ic.getMethod().getName());  
  14.         obj = ic.proceed();      
  15.     }  
  16.     @Override 
  17.     public String greet(String name)  
  18.     {  
  19.         return "hello " + name;  
  20.     }  

上面的Stateful Session Bean中定義了兩個(gè)攔截器方法和一個(gè)Bean方法。當(dāng)客戶端調(diào)用greet方法時(shí),EJB容器會(huì)先調(diào)用myInterceptorMethod1方法,然后會(huì)調(diào)用myInterceptorMethod2方法,最后會(huì)調(diào)用greet方法。使用攔截器方法時(shí)要注意如下幾點(diǎn):

1.  攔截器方法必須有一個(gè)返回值,返回值類型是Object。

2.  攔截器方法只能有一個(gè)參數(shù),而且該參數(shù)類型必須是javax.interceptor.InvocationContext。

3.  只有調(diào)用InvocationContext接口的proceed方法,EJB容器才會(huì)調(diào)用下一個(gè)攔截器方法或被攔截的Bean方法。

4.  由于proceed方法要求拋出一個(gè)Exception異常,因此,攔截器方法必須拋出一個(gè)Exception異常,或在攔截器方法中使用try...catch來捕捉proceed方法拋出的異常。

二、攔截器類

有一些攔截器方法會(huì)攔截器不同Bean中的方法,在這種情況下,需要將攔截器方法放在一個(gè)單獨(dú)的類中。這個(gè)類就叫攔截器類。下面是一個(gè)攔截器類的代碼:

  1. package service;  
  2.  
  3. import javax.interceptor.AroundInvoke;  
  4. import javax.interceptor.InvocationContext;  
  5.  
  6. public class MyInterceptor  
  7. {  
  8.     @AroundInvoke 
  9.     public Object interceptorMethod(InvocationContext ic) throws Exception  
  10.     {  
  11.         System.out.println("MyInterceptor:" + ic.getMethod().getName());  
  12.         return ic.proceed();  
  13.     }  
  14. }  

為了使用該攔截器類,需要在SessionBean或MDB中使用@Interceptors來指定要使用的攔截器類。代碼如下:

  1. @Stateful 
  2. @Interceptors(MyInterceptor.class)  
  3. public class GreeterBean implements Greeter  
  4. {  
  5.     @AroundInvoke 
  6.     public Object myInterceptorMethod1(InvocationContext ic) throws Exception  
  7.     {  
  8.         System.out.println("myInterceptorMethod1:" + ic.getMethod().getName());  
  9.         obj = ic.proceed();      
  10.     }  
  11.     @AroundInvoke 
  12.     public Object myInterceptorMethod2(InvocationContext ic) throws Exception  
  13.     {  
  14.         System.out.println("myInterceptorMethod2:" + ic.getMethod().getName());  
  15.         obj = ic.proceed();      
  16.     }  
  17.     @Override 
  18.     public String greet(String name)  
  19.     {  
  20.         return "hello " + name;  
  21.     }  

如果有多個(gè)攔截器類,可以使用如下的代碼來指定這些攔截器類:

  1. @Interceptors({MyInterceptor.class, MyInterceptor1.class}) 

如果指定了多個(gè)攔截器類和攔截器方法,就涉及到一個(gè)調(diào)用順序的問題。EJB容器會(huì)先調(diào)用攔截器類中的攔截器方法、如果有多個(gè)攔截器類被指定,按指定的順序進(jìn)行調(diào)用。也就是說,MyInterceptor類中的攔截器方法會(huì)最先被調(diào)用,然后是MyInterceptor1類中的攔截器方法。最后會(huì)調(diào)用在Bean中定義的攔截器方法(myInterceptorMethod1和myInterceptorMethod2)。

在默認(rèn)情況下,攔截器類將攔截所有的Bean方法,但可以使用@ExcludeClassInterceptors注釋來阻止攔截器對某個(gè)Bean方法進(jìn)行攔截。如在GreeterBean類中還有一個(gè)getValue方法,那么阻止該方法被攔截的代碼如下:

  1. @ExcludeClassInterceptors 
  2. public String getValue()  
  3. {  
  4.     return "abcd";  

使用@ExcludeClassInterceptors只能阻止攔截器類中的攔截器方法對Bean方法的攔截,而在Bean中定義的攔截器方法仍然會(huì)攔截Bean方法。

【編輯推薦】

  1. Eclipse+JBoss+EJB3通過繼承實(shí)體Bean將單個(gè)表映射成多個(gè)表
  2. Eclipse+JBoss+EJB3消息驅(qū)動(dòng)Bean
  3. Eclipse+JBoss+EJB3在Servlet中訪問EntityManager對象
  4. Eclipse+JBoss+EJB3使用命名查詢執(zhí)行JPQL
  5. Eclipse+JBoss+EJB3實(shí)體Bean的連接策略


 

責(zé)任編輯:book05 來源: BlogJava
相關(guān)推薦

2009-06-24 15:59:04

消息驅(qū)動(dòng)Bean

2009-06-10 11:42:26

Session BeaEclipse+JBo

2009-09-27 17:37:32

Hibernate攔截

2025-02-28 08:14:53

2009-06-10 11:36:45

有狀態(tài)的SessionEclipse+JBo

2023-09-05 08:58:07

2011-05-16 10:14:11

Hibernate

2009-07-08 17:02:11

JDK實(shí)現(xiàn)調(diào)用攔截器

2009-06-24 15:56:47

實(shí)體Bean連接策略

2011-11-21 14:21:26

SpringMVCJava框架

2009-06-24 15:57:44

JPQL命名查詢

2009-06-25 15:54:42

Struts2教程攔截器

2009-06-24 15:58:15

EntityManag

2009-06-10 11:09:40

配置文件SessionEclipse+JBo

2009-06-10 12:34:01

Session BeaEclipse+JBo

2020-03-25 17:55:30

SpringBoot攔截器Java

2012-02-03 13:27:16

2009-02-04 14:19:38

2023-09-15 11:26:16

2013-11-04 09:35:38

Firefox插件攔截FLASH
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)