`
seara
  • 浏览: 648667 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

eclipse + JBoss 5 + EJB3开发指南(15):拦截器方法和拦截器类

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:eclipse + JBoss 5 + EJB3开发指南(14):消息驱动Bean

一、拦截器方法

EJB3可以通过拦截器对Bean方法进行拦截和覆盖。这有些象AOP中的around。通过AOP的around方法,可以修改被拦截方法的返回值、参数值,甚至可以取消被拦截方法的执行。EJB3的拦截器可以用在无状态Session Bean、有状态Session Bean和消息驱动Bean(MDB)的方法中。实现拦截器的最简单的方法是使用拦截器方法。也就是说,只要在当前的Bean中使用@AroundInvoke对某个方法进行注释(关于拦截器的类都在javax.interceptor包中),那么这个方法就会变成拦截器方法,该拦截器方法会拦截当前Bean中的所有方法。实现过程如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->@Stateful
publicclassGreeterBeanimplementsGreeter
{
@AroundInvoke
publicObjectmyInterceptorMethod1(InvocationContextic)throwsException
{
System.out.println(
"myInterceptorMethod1:"+ic.getMethod().getName());
obj
=ic.proceed();
}
@AroundInvoke
publicObjectmyInterceptorMethod2(InvocationContextic)throwsException
{
System.out.println(
"myInterceptorMethod2:"+ic.getMethod().getName());
obj
=ic.proceed();
}
@Override
publicStringgreet(Stringname)
{
return"hello"+name;
}
}

上面的Stateful Session Bean中定义了两个拦截器方法和一个Bean方法。当客户端调用greet方法时,EJB容器会先调用myInterceptorMethod1方法,然后会调用myInterceptorMethod2方法,最后会调用greet方法。使用拦截器方法时要注意如下几点:
1. 拦截器方法必须有一个返回值,返回值类型是Object。
2. 拦截器方法只能有一个参数,而且该参数类型必须是javax.interceptor.InvocationContext。
3. 只有调用InvocationContext接口的proceed方法,EJB容器才会调用下一个拦截器方法或被拦截的Bean方法。
4. 由于proceed方法要求抛出一个Exception异常,因此,拦截器方法必须抛出一个Exception异常,或在拦截器方法中使用try...catch来捕捉proceed方法抛出的异常。

二、拦截器类
有一些拦截器方法会拦截器不同Bean中的方法,在这种情况下,需要将拦截器方法放在一个单独的类中。这个类就叫拦截器类。下面是一个拦截器类的代码:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packageservice;

importjavax.interceptor.AroundInvoke;
importjavax.interceptor.InvocationContext;

publicclassMyInterceptor
{
@AroundInvoke
publicObjectinterceptorMethod(InvocationContextic)throwsException
{
System.out.println(
"MyInterceptor:"+ic.getMethod().getName());
returnic.proceed();
}
}

为了使用该拦截器类,需要在SessionBean或MDB中使用@Interceptors来指定要使用的拦截器类。代码如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->@Stateful
@Interceptors(MyInterceptor.
class)
publicclassGreeterBeanimplementsGreeter
{
@AroundInvoke
publicObjectmyInterceptorMethod1(InvocationContextic)throwsException
{
System.out.println(
"myInterceptorMethod1:"+ic.getMethod().getName());
obj
=ic.proceed();
}
@AroundInvoke
publicObjectmyInterceptorMethod2(InvocationContextic)throwsException
{
System.out.println(
"myInterceptorMethod2:"+ic.getMethod().getName());
obj
=ic.proceed();
}
@Override
publicStringgreet(Stringname)
{
return"hello"+name;
}
}

如果有多个拦截器类,可以使用如下的代码来指定这些拦截器类:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->@Interceptors({MyInterceptor.class,MyInterceptor1.class})

如果指定了多个拦截器类和拦截器方法,就涉及到一个调用顺序的问题。EJB容器会先调用拦截器类中的拦截器方法、如果有多个拦截器类被指定,按指定的顺序进行调用。也就是说,MyInterceptor类中的拦截器方法会最先被调用,然后是MyInterceptor1类中的拦截器方法。最后会调用在Bean中定义的拦截器方法(myInterceptorMethod1和myInterceptorMethod2)。
在默认情况下,拦截器类将拦截所有的Bean方法,但可以使用@ExcludeClassInterceptors注释来阻止拦截器对某个Bean方法进行拦截。如在GreeterBean类中还有一个getValue方法,那么阻止该方法被拦截的代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->@ExcludeClassInterceptors
publicStringgetValue()
{
return"abcd";
}

使用@ExcludeClassInterceptors只能阻止拦截器类中的拦截器方法对Bean方法的拦截,而在Bean中定义的拦截器方法仍然会拦截Bean方法。



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    jboss-ejb3-interceptors.jar.zip

    首先,"jbossejb3-interceptors.jar"是JBoss EJB3框架中用于处理拦截器的库文件,它包含了执行EJB3拦截器逻辑所需的所有类和资源。这个库的核心是`org.jboss.ejb3.interceptor`包,其中定义了拦截器的相关接口和类,...

    EJB3+JPA开发总结

    - **内部拦截器**:直接在Bean类的方法上定义。 **示例代码**: ```java @Stateless public class StatelessService implements RemoteService { @AroundInvoke public Object interceptMethod...

    Jboss EJB3.0教程

    - 讲解拦截器的概念及其在EJB3.0中的应用场景。 - 如何编写和配置拦截器。 - **依赖注入 (Dependency Injection)**: - 介绍依赖注入的基本原理和技术实现。 - 如何在EJB3.0中利用注解自动完成依赖注入。 - **...

    《SeamInAction》+《JbossSeam》+《官方中文指南》

    此外,Seam还支持CDI,这使得开发者可以利用更多的Java EE特性,如拦截器和异步处理。 总之,拥有《Seam In Action》、《JBoss Seam》和《官方中文指南》这些资源,开发者可以系统地学习和精通Seam框架,从而在企业...

    struts2-ejb3配置

    Struts2和EJB3是两个在Java Web开发中广泛使用的框架,Struts2主要用于处理MVC模式的前端控制,而EJB3则提供企业级的服务,如事务管理、安全性和持久化等。将这两者整合在一起,可以利用EJB3的强大功能来处理复杂的...

    Jboss EJB3.0 实例教程.pdf

    - **拦截器**:用于在方法调用前后执行特定逻辑,例如日志记录、性能监控等。 - **依赖注入**:自动装配Bean所需的资源和服务,减少代码复杂度。 - **定时服务**:支持定时任务的创建和管理,提高应用的灵活性。 - *...

    JBoss EJB3.0实例教程

    - **拦截器与依赖注入**:拦截器用于在方法调用前后执行特定操作,而依赖注入则简化了对象之间的依赖管理,这两个特性在现代企业应用开发中极为常见。 #### 知识点五:JMS与消息驱动Bean - **消息传递模型**:教程...

    EJB2和EJB3的架构异同.doc

    总的来说,EJB3.0通过注解简化了编程模型,引入了JPA使得持久化更加直观,同时引入了拦截器来增强功能和灵活性,这些改进极大地提高了开发效率和代码的可维护性。然而,需要注意的是,虽然EJB3.0在许多方面比EJB2.0...

    JBoss WebJBOSS的负载平衡与失效转发策略是由最后一个拦截器实现的

    EJB对像,而采用了一个迂回的方法,更专业的说是一种设计模式――代理模式,真正与客户端交互的是一个代理对像①,这 个代理对像一般由客户端通过JNDI技术来取得的。而具体的代理对像的实现就由各厂商自完成了,在...

    JBOSS EJB3.0实例教程

    ### JBoss EJB3.0 实例教程知识点详解 #### 一、教程概览与适用人群 本教程《JBoss EJB3.0 实例教程...通过这些内容的学习,开发者们可以更加系统地理解和掌握JBoss EJB3.0的相关技术,并将其应用于实际项目开发中。

    EJB3.1讲解

    - **拦截器**:新增了更多的拦截器机制,方便对方法调用进行拦截和处理。 - **资源注入**:增强了依赖注入的功能,使得获取资源更加简单。 #### 资源管理和基本服务 ##### 资源管理 EJB 3.1提供了强大的资源管理...

    Jboss5源代码-官方-第一部分

    `jboss.ejb3`包包含了EJB容器的源代码,如EJB3的生命周期管理、容器服务和拦截器等。 4. **Web服务**:JBoss支持SOAP和RESTful Web服务。`jboss.ws`包包含了Web服务的相关实现,如WS-Addressing、WS-Security等。...

    EJB3笔记代码

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

    EJB3.0学习心得

    - **服务器配置**: 如 jboss-4.0.4.GA 等应用服务器需要配置特定的 JAR 文件,如 jboss-ejb3x.jar 和 jboss-annotations-ejb3.jar 来支持 EJB 3.0。 **7. 示例代码** 下面是一个简单的示例代码,展示了如何定义...

    ejb3·0入门经典教程

    ### EJB3.0入门经典教程知识点概览 #### 一、EJB3.0简介与环境搭建...以上知识点概览覆盖了《ejb3·0入门经典教程》的主要内容,旨在为初学者提供全面而深入的学习指南,帮助他们快速掌握EJB3.0的核心技术和开发技巧。

    JbossSeam中文开发指南.docx

    Jboss Seam中文开发指南 Jboss Seam是基于Java EE 5.0的框架,提供了一个基于组件的架构,能够帮助开发者快速构建企业级应用程序。Seam框架提供了一个统一的编程模型,能够将JSF、EJB、JPA等技术整合在一起,提供了...

Global site tag (gtag.js) - Google Analytics