(EJB3.0学习笔记三)拦截器(Interceptor)

阅读更多
拦截器可以监听程序的一个或所有方法.拦截器对方法调用流提供了细粒度控制.可以在无状态会话 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 注释就指定了要用作拦截器的方法.  

你可能感兴趣的:(Bean,EJB)