EJB拦截器(Interceptor)[转]

注:本文转自http://bclxz520.iteye.com/blog/67603 ,仅用于自身学习。

 

拦截器可以监听程序的一个或所有方法.拦截器对方法调用流提供了细粒度控制.可以在无状态会话 bean,有状态会话 bean 和消息驱动 bean 上使用它们.拦截器可以是同一 bean 类中的方法或是一个外部类.
下面介绍如何在Session Bean类中使用外部拦截器类.

HelloChinaBean.java
    package com.foshanshop.ejb3.impl;  
      
    import com.foshanshop.ejb3.HelloChina;  
    import com.foshanshop.ejb3.HelloChinaRemote;  
      
      
    import javax.ejb.Local;  
    import javax.ejb.Remote;  
    import javax.ejb.Stateless;  
    import javax.interceptor.Interceptors;  
      
    @Stateless  
    @Remote ({HelloChinaRemote.class})  
    @Local(HelloChina.class)  
    @Interceptors({HelloInterceptor.class})   
    public class HelloChinaBean implements HelloChina,HelloChinaRemote {  
      
        public String SayHello(String name) {  
            return name +"说:你好!中国.";  
        }  
      
        public String Myname() {          
            return "我是佛山人";  
        }  
      
    }  
 


@Interceptors 注释指定一个或多个在外部类中定义的拦截器.上面拦截器HelloInterceptor对HelloChinaBean中
的所有方法进行监听.

HelloInterceptor.java
    package com.foshanshop.ejb3.impl;  
      
    import javax.interceptor.AroundInvoke;  
    import javax.interceptor.InvocationContext;  
      
      
    public class HelloInterceptor {  
      
        @AroundInvoke  
        public Object log(InvocationContext ctx) throws Exception {  
            System.out.println("*** HelloInterceptor intercepting");  
            long start = System.currentTimeMillis();  
            try{  
                if (ctx.getMethod().getName().equals("SayHello")){  
                    System.out.println("*** SayHello 已经被调用! *** " );  
                }              
                if (ctx.getMethod().getName().equals("Myname")){  
                    System.out.println("*** Myname 已经被调用! *** " );  
                }              
                return ctx.proceed();  
            }catch (Exception e) {  
                throw e;  
                  
            }finally {  
                long time = System.currentTimeMillis() - start;      
                System.out.println("用时:"+ time + "ms");  
            }  
        }  
    }  
 

@AroundInvoke 注释指定了要用作拦截器的方法.用@AroundInvoke注释指定的方法必须遵守以下格式:
public Object XXX(InvocationContext ctx) throws Exception
XXX代表方法名可以任意.
下面是HelloChinaBean的本地及远程业务接口

HelloChinaRemote .java
    package com.foshanshop.ejb3;  
      
    public interface HelloChinaRemote {  
        public String SayHello(String name);  
          
        public String Myname();  
    }  
 HelloChina.java
 
    package com.foshanshop.ejb3;  
      
    public interface HelloChina  extends HelloChinaRemote{  
      
    }  
 

除了可以在外部定义拦截器之外,还可以将Session Bean中的一个或多个方法定义为拦截器.

HelloChinaBean.java
package com.foshanshop.ejb3.impl;  
import com.foshanshop.ejb3.HelloChina;  
import com.foshanshop.ejb3.HelloChinaRemote;  
import javax.ejb.Local;  
import javax.ejb.Remote;  
import javax.ejb.Stateless;  
import javax.interceptor.AroundInvoke;  
import javax.interceptor.InvocationContext;  
@Stateless  
@Remote ({HelloChinaRemote.class})  
@Local(HelloChina.class)  
public class HelloChinaBean implements HelloChina,HelloChinaRemote {  
public String SayHello(String name) {  
return name +"说:你好!中国.";  
}  
public String Myname() {  
return "我是佛山人";  
}  
@AroundInvoke  
public Object log(InvocationContext ctx) throws Exception {  
try{  
if (ctx.getMethod().getName().equals("SayHello")){  
System.out.println("*** HelloChinaBean.SayHello() 已经被调用! *** " );  
}  
if (ctx.getMethod().getName().equals("Myname")){  
System.out.println("*** HelloChinaBean.Myname() 已经被调用! *** " );  
}  
return ctx.proceed();  
}catch (Exception e) {  
throw e;  
}  
}  
}   
 

上面只需一个@AroundInvoke 注释就指定了要用作拦截器的方法.  

 

  

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值