程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> Eclipse+JBoss+EJB3攔截器方法和攔截器類

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

編輯:J2EE

一、攔截器方法

EJB3可以通過攔截器對Bean方法進行攔截和覆蓋。這有些象AOP中的around。通過AOP的around方法,可以修改被攔截方法的返回值、參數值,甚至可以取消被攔截方法的執行。EJB3的攔截器可以用在無狀態Session Bean、有狀態Session Bean和消息驅動Bean(MDB)的方法中。實現攔截器的最簡單的方法是使用攔截器方法。也就是說,只要在當前的Bean中使用@AroundInvoke對某個方法進行注釋(關於攔截器的類都在Javax.interceptor包中),那麼這個方法就會變成攔截器方法,該攔截器方法會攔截當前Bean中的所有方法。實現過程如下:

  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. }
  21. }

上面的Stateful Session Bean中定義了兩個攔截器方法和一個Bean方法。當客戶端調用greet方法時,EJB容器會先調用myInterceptorMethod1方法,然後會調用myInterceptorMethod2方法,最後會調用greet方法。使用攔截器方法時要注意如下幾點:

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

2. 攔截器方法只能有一個參數,而且該參數類型必須是Javax.interceptor.InvocationContext。

3. 只有調用InvocationContext接口的proceed方法,EJB容器才會調用下一個攔截器方法或被攔截的Bean方法。

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

二、攔截器類

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

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

為了使用該攔截器類,需要在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. }
  22. }

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

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

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

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved