本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:
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开发速学宝典》出版,欢迎定购
分享到:
相关推荐
中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...
EJB对像,而采用了一个迂回的方法,更专业的说是一种设计模式――代理模式,真正与客户端交互的是一个代理对像①,这 个代理对像一般由客户端通过JNDI技术来取得的。而具体的代理对像的实现就由各厂商自完成了,在...
struts2-ejb3配置,可以在EJB上面使用struts2 和JBOSS一起使用。
4.6 拦截器(INTERCEPTOR) ...26 4.7 依赖注入(DEPENDENCY INJECTION).......29 第五章消息驱动 BEAN (MESSAGE DRIVEN BEAN) .....33 第六章 实体 BEAN(ENTITY BEAN) .36 6.1 实体 BEAN的组成文件PERSISTENCE.XML配置...
4.6 拦截器(INTERCEPTOR) ...26 4.7 依赖注入(DEPENDENCY INJECTION).......29 第五章消息驱动 BEAN (MESSAGE DRIVEN BEAN) .....33 第六章 实体 BEAN(ENTITY BEAN) .36 6.1 实体 BEAN的组成文件PERSISTENCE.XML配置...
答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 ...
1.4. Seam 和jBPM:待办事项列表(todo list)示例..................................................................................................... 32 1.4.1. 理解代码....................................
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
4.6 拦截器(INTERCEPTOR) ..............................................................................................................................................26 4.7 依赖注入(DEPENDENCY ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...
实体二级表、实体更新、实体、注射、拦截、J2SE JBoss公司、JCA、JNDI、本地远程、管理、消息组件 开放式EJB(16)、持久性、资源、安全、购物车、有状态会企业组件 无状态会话企业组件、定时器、交易、Web服务、、 ...