EJB3.0攔截器

來源:互聯網
上載者:User
攔截器可以監聽程式的一個或所有方法.攔截器對方法調用流提供了細粒度控制.可以在無狀態會話 bean,有狀態會話 bean 和訊息驅動 bean 上使用它們.攔截器可以是同一 bean 類中的方法或是一個外部類.
下面介紹如何在Session Bean類中使用外部攔截器類.HelloChinaBean.java  
  1. package com.foshanshop.ejb3.impl;  
  2.   
  3. import com.foshanshop.ejb3.HelloChina;  
  4. import com.foshanshop.ejb3.HelloChinaRemote;  
  5.   
  6.   
  7. import javax.ejb.Local;  
  8. import javax.ejb.Remote;  
  9. import javax.ejb.Stateless;  
  10. import javax.interceptor.Interceptors;  
  11.   
  12. @Stateless  
  13. @Remote ({HelloChinaRemote.class})  
  14. @Local(HelloChina.class)  
  15. @Interceptors({HelloInterceptor.class})   
  16. public class HelloChinaBean implements HelloChina,HelloChinaRemote {  
  17.   
  18.     public String SayHello(String name) {  
  19.         return name +"說:你好!中國.";  
  20.     }  
  21.   
  22.     public String Myname() {          
  23.         return "我是佛山人";  
  24.     }  
  25.   
  26. }  

@Interceptors 注釋指定一個或多個在外部類中定義的攔截器.上面攔截器HelloInterceptor對HelloChinaBean中
的所有方法進行監聽.

HelloInterceptor.java
 
  1. package com.foshanshop.ejb3.impl;  
  2.   
  3. import javax.interceptor.AroundInvoke;  
  4. import javax.interceptor.InvocationContext;  
  5.   
  6.   
  7. public class HelloInterceptor {  
  8.   
  9.     @AroundInvoke  
  10.     public Object log(InvocationContext ctx) throws Exception {  
  11.         System.out.println("*** HelloInterceptor intercepting");  
  12.         long start = System.currentTimeMillis();  
  13.         try{  
  14.             if (ctx.getMethod().getName().equals("SayHello")){  
  15.                 System.out.println("*** SayHello 已經被調用! *** " );  
  16.             }              
  17.             if (ctx.getMethod().getName().equals("Myname")){  
  18.                 System.out.println("*** Myname 已經被調用! *** " );  
  19.             }              
  20.             return ctx.proceed();  
  21.         }catch (Exception e) {  
  22.             throw e;  
  23.               
  24.         }finally {  
  25.             long time = System.currentTimeMillis() - start;      
  26.             System.out.println("用時:"+ time + "ms");  
  27.         }  
  28.     }  
  29. }  

@AroundInvoke 注釋指定了要用作攔截器的方法.用@AroundInvoke注釋指定的方法必須遵守以下格式:
public Object XXX(InvocationContext ctx) throws Exception
XXX代表方法名可以任意.
下面是HelloChinaBean的本地及遠程業務介面HelloChinaRemote .java
 

  1. package com.foshanshop.ejb3;  
  2.   
  3. public interface HelloChinaRemote {  
  4.     public String SayHello(String name);  
  5.       
  6.     public String Myname();  
  7. }  
HelloChina.java 
  1. package com.foshanshop.ejb3;  
  2.   
  3. public interface HelloChina  extends HelloChinaRemote{  
  4.   
  5. }  

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

  1. package com.foshanshop.ejb3.impl;  
  2. import com.foshanshop.ejb3.HelloChina;  
  3. import com.foshanshop.ejb3.HelloChinaRemote;  
  4. import javax.ejb.Local;  
  5. import javax.ejb.Remote;  
  6. import javax.ejb.Stateless;  
  7. import javax.interceptor.AroundInvoke;  
  8. import javax.interceptor.InvocationContext;  
  9. @Stateless  
  10. @Remote ({HelloChinaRemote.class})  
  11. @Local(HelloChina.class)  
  12. public class HelloChinaBean implements HelloChina,HelloChinaRemote {  
  13. public String SayHello(String name) {  
  14. return name +"說:你好!中國.";  
  15. }  
  16. public String Myname() {  
  17. return "我是佛山人";  
  18. }  
  19. @AroundInvoke  
  20. public Object log(InvocationContext ctx) throws Exception {  
  21. try{  
  22. if (ctx.getMethod().getName().equals("SayHello")){  
  23. System.out.println("*** HelloChinaBean.SayHello() 已經被調用! *** " );  
  24. }  
  25. if (ctx.getMethod().getName().equals("Myname")){  
  26. System.out.println("*** HelloChinaBean.Myname() 已經被調用! *** " );  
  27. }  
  28. return ctx.proceed();  
  29. }catch (Exception e) {  
  30. throw e;  
  31. }  
  32. }  
  33. }  

上面只需一個@AroundInvoke 注釋就指定了要用作攔截器的方法.   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.