EJB3.0学习笔记之三 Interceptor

来源:互联网 发布:天刀怎么下载捏脸数据 编辑:程序博客网 时间:2024/06/02 16:54
截获器可以监听程序的一个或所有方法.截获器对方法调用流提供了细粒度控制.可以在无状态会话 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. import javax.ejb.Local;  
  6. import javax.ejb.Remote;  
  7. import javax.ejb.Stateless;  
  8. import javax.interceptor.Interceptors;  
  9.   
  10. @Stateless  
  11. @Remote ({HelloChinaRemote.class})  
  12. @Local(HelloChina.class)  
  13. @Interceptors({HelloInterceptor.class})   
  14. public class HelloChinaBean implements HelloChina,HelloChinaRemote {  
  15.   
  16.     public String SayHello(String name) {  
  17.         return name +"说:你好!中国.";  
  18.     }  
  19.   
  20.     public String Myname() {          
  21.         return "我是佛山人";  
  22.     }  
  23.   
  24. }  

@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 注释就指定了要用作截获器的方法.