拦截器可以监听程序的一个或所有方法.拦截器对方法调用流提供了细粒度控制.可以在无状态会话 bean,有状态会话 bean 和消息驱动 bean 上使用它们.
拦截器可以是同一 bean 类中的方法或是一个外部类.
下面介绍如何在Session Bean类中使用外部拦截器类.
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代表方法名可以任意.
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拦截器中,我们可以定义多个拦截器方法,这些方法会在EJB的生命周期事件(如方法调用、创建、销毁等)触发时按顺序执行。拦截器方法通过`@AroundInvoke`、`@PostConstruct`、`@PreDestroy`等注解标识,这些注解...
EJB3中的拦截器可以是内部类或外部类,这里的“8.EJB3的拦截器(外部类)”可能是指定义在单独类中的拦截器。 ### 2. 定义拦截器 创建一个拦截器需要实现`javax.interceptor.Interceptor`接口,并使用`@Interceptor`...
在JavaEE应用的部署描述符(如`ejb-jar.xml`或`web.xml`)中启用并配置拦截器。或者,如果你使用的是CDI(Contexts and Dependency Injection),可以在`beans.xml`中进行配置。 5. **运行与测试** 部署应用程序...
这个库的核心是`org.jboss.ejb3.interceptor`包,其中定义了拦截器的相关接口和类,如`Interceptor`, `InterceptorChain`, `InterceptorInfo`等,它们共同构建了EJB3拦截器的执行模型。 拦截器在EJB3中扮演的角色...
其次,AOP在EJB中的实现通常依赖于Java EE容器提供的拦截器(Interceptor)。拦截器可以在方法调用前后执行自定义逻辑,这与AOP的切面概念非常相似。在EJB中,我们可以通过以下步骤实现: 1. **定义拦截器**:创建...
在Java EE 6及更高版本中,JSR 318引入了拦截器规范,使得开发者可以创建符合统一接口的拦截器,这些拦截器可以与EJB(Enterprise JavaBeans)或者CDI(Contexts and Dependency Injection)一起工作。拦截器通过在...
本笔记代码主要涵盖了EJB3的一些核心特性,包括定时任务(timer)、会话bean(session)、实体bean(entity)、拦截器(interceptor)、领域模型(domain)、客户端(client)、事务管理(transaction)、消息传递...
通过`@Interceptor`和`@AroundInvoke`等注解,开发者可以自定义拦截器行为。 在示例中,我们可能会看到一个简单的Servlet,它调用了一个EJB 3.0的bean来处理请求。这个bean可能是无状态的,负责与数据库交互,实现...
- 通过`@Interceptor`注解定义拦截器类。 - 通过`@AroundInvoke`等注解定义拦截逻辑。 - **依赖注入**: - 通过`@Inject`注解实现自动装配。 - 支持字段注入、构造函数注入等。 #### 5. 消息驱动Bean (Message-...
@Interceptor注解用于定义拦截器,@AroundInvoke注解标记拦截方法。 7. **实例教程** 《ejb3.0实例教程.pdf》很可能包含了逐步指导,展示如何创建和部署EJB 3.0组件,以及如何与其他Java EE组件(如Web服务、...
6. **Interceptors**:EJB2.0引入了拦截器(Interceptor),这是一个预定义的回调机制,允许在方法调用前后插入自定义代码,用于执行如日志记录、事务控制等通用任务,提高了代码复用性和模块化。 7. **J2EE ...
通过Interceptor拦截器,Struts2可以实现AOP(面向切面编程),如日志、权限验证等功能。 **Spring** 是一个全面的后端应用程序框架,提供依赖注入(DI)和面向切面编程(AOP)。DI使得对象之间的关系可以在运行时...
- `@Interceptor` 注释符用于指定拦截器。 - `@PostConstruct` 和 `@PreDestroy` 注释符用于标记 Bean 的初始化和销毁方法。 ##### 3.7 Timeout - `@Timeout` 注释符用于处理有状态会话 Bean 的超时事件。 ##### ...
除了依赖注入,EJB3.0还引入了截获器(Interceptor)的概念。截获器允许开发者定义在bean的业务方法或生命周期事件前后的拦截逻辑,提供了AOP(面向切面编程)的能力。截获器方法可以通过注解(如@AroundInvoke、@...
2. **Interceptor**:拦截器允许在执行 Action 之前和之后插入自定义逻辑,例如日志记录、权限验证等。 3. **Value Stack**:用于传递数据,简化视图层的数据绑定。 4. **Result**:定义了 Action 执行后如何呈现...
在EJB运行过程中, Stub和拦截器(Request Interceptor)扮演着重要角色。Stub作为远程对象的本地代理,隐藏了网络调用细节,而拦截器则负责调用中间件服务并将业务请求委托给EJB。开发时,需要编写业务接口(Remote...
@Interceptor和@AroundInvoke注解分别用于定义拦截器和拦截方法。 8. **异步方法(Asynchronous Methods)**:通过@Asynchronous注解,开发者可以声明方法以异步方式执行,提高应用的并发性能。 9. **Web服务支持*...
**2.10 拦截器(INTERCEPTOR)** 用于在方法调用前后执行特定代码,例如日志记录或性能监控。 **2.11 依赖注入(DEPENDENCY INJECTION)** 依赖注入是一种设计模式,用于自动管理组件间的依赖关系,提高代码的可测试...