`

EJB拦截器(Interceptor)[转]

    博客分类:
  • EJB
 
阅读更多

注:本文转自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 注释就指定了要用作拦截器的方法.  

 

  

 

 

 

分享到:
评论

相关推荐

    EJB拦截器的Demo

    在EJB拦截器中,我们可以定义多个拦截器方法,这些方法会在EJB的生命周期事件(如方法调用、创建、销毁等)触发时按顺序执行。拦截器方法通过`@AroundInvoke`、`@PostConstruct`、`@PreDestroy`等注解标识,这些注解...

    8.EJB3的拦截器(外部类)

    EJB3中的拦截器可以是内部类或外部类,这里的“8.EJB3的拦截器(外部类)”可能是指定义在单独类中的拦截器。 ### 2. 定义拦截器 创建一个拦截器需要实现`javax.interceptor.Interceptor`接口,并使用`@Interceptor`...

    JavaEE 拦截器简单示例源代码

    在JavaEE应用的部署描述符(如`ejb-jar.xml`或`web.xml`)中启用并配置拦截器。或者,如果你使用的是CDI(Contexts and Dependency Injection),可以在`beans.xml`中进行配置。 5. **运行与测试** 部署应用程序...

    jboss-ejb3-interceptors.jar.zip

    这个库的核心是`org.jboss.ejb3.interceptor`包,其中定义了拦截器的相关接口和类,如`Interceptor`, `InterceptorChain`, `InterceptorInfo`等,它们共同构建了EJB3拦截器的执行模型。 拦截器在EJB3中扮演的角色...

    EJB+Annotation实现AOP的DEMO

    其次,AOP在EJB中的实现通常依赖于Java EE容器提供的拦截器(Interceptor)。拦截器可以在方法调用前后执行自定义逻辑,这与AOP的切面概念非常相似。在EJB中,我们可以通过以下步骤实现: 1. **定义拦截器**:创建...

    Java EE Performance Measuring Interceptor.zip

    在Java EE 6及更高版本中,JSR 318引入了拦截器规范,使得开发者可以创建符合统一接口的拦截器,这些拦截器可以与EJB(Enterprise JavaBeans)或者CDI(Contexts and Dependency Injection)一起工作。拦截器通过在...

    EJB3笔记代码

    本笔记代码主要涵盖了EJB3的一些核心特性,包括定时任务(timer)、会话bean(session)、实体bean(entity)、拦截器(interceptor)、领域模型(domain)、客户端(client)、事务管理(transaction)、消息传递...

    EJB3.0_Servlet.rar_ejb3.0 example

    通过`@Interceptor`和`@AroundInvoke`等注解,开发者可以自定义拦截器行为。 在示例中,我们可能会看到一个简单的Servlet,它调用了一个EJB 3.0的bean来处理请求。这个bean可能是无状态的,负责与数据库交互,实现...

    Ejb3.0帮助文档包(开发手册&实例教程)

    @Interceptor注解用于定义拦截器,@AroundInvoke注解标记拦截方法。 7. **实例教程** 《ejb3.0实例教程.pdf》很可能包含了逐步指导,展示如何创建和部署EJB 3.0组件,以及如何与其他Java EE组件(如Web服务、...

    ejb2.0.rar_EJB2.0特性_ejb2.0

    6. **Interceptors**:EJB2.0引入了拦截器(Interceptor),这是一个预定义的回调机制,允许在方法调用前后插入自定义代码,用于执行如日志记录、事务控制等通用任务,提高了代码复用性和模块化。 7. **J2EE ...

    EJB依赖注入的原理

    除了依赖注入,EJB3.0还引入了截获器(Interceptor)的概念。截获器允许开发者定义在bean的业务方法或生命周期事件前后的拦截逻辑,提供了AOP(面向切面编程)的能力。截获器方法可以通过注解(如@AroundInvoke、@...

    EJB3规范 简体中文

    - `@Interceptor` 注释符用于指定拦截器。 - `@PostConstruct` 和 `@PreDestroy` 注释符用于标记 Bean 的初始化和销毁方法。 ##### 3.7 Timeout - `@Timeout` 注释符用于处理有状态会话 Bean 的超时事件。 ##### ...

    struts2+spring+ejb3源代码(完整版)

    通过Interceptor拦截器,Struts2可以实现AOP(面向切面编程),如日志、权限验证等功能。 **Spring** 是一个全面的后端应用程序框架,提供依赖注入(DI)和面向切面编程(AOP)。DI使得对象之间的关系可以在运行时...

    EJB3.0实例教程服务器为JBOSS

    ##### 4.6 拦截器 (Interceptor) - **定义**: 截取 EJB 方法调用的逻辑,可以用来实现日志记录、性能监控等功能。 - **配置**: 在 `ejb-jar.xml` 文件中配置拦截器。 ##### 4.7 依赖注入 (Dependency Injection) ...

    struts2+EJB3.0开发实例项目

    2. **Interceptor**:拦截器允许在执行 Action 之前和之后插入自定义逻辑,例如日志记录、权限验证等。 3. **Value Stack**:用于传递数据,简化视图层的数据绑定。 4. **Result**:定义了 Action 执行后如何呈现...

    EJB学习笔记、运行机制

    在EJB运行过程中, Stub和拦截器(Request Interceptor)扮演着重要角色。Stub作为远程对象的本地代理,隐藏了网络调用细节,而拦截器则负责调用中间件服务并将业务请求委托给EJB。开发时,需要编写业务接口(Remote...

Global site tag (gtag.js) - Google Analytics