添加拦截器
EJB 3.0 还增加了在您的应用程序中使用面向方面的编程技术这一能力。EJB 3.0 支持拦截器,这使您能够拦截用于横切技术的代码。接下来,您将创建审核拦截器,该拦截器将显示客户在管理控制台上的操作。
创建简单的 Audit 类:
创建一个称为 AuditInterceptor 的类(图 74)。
图 74. 新建 Java 类
添加下面以粗体显示的代码。@AroundInvoke 将告诉该容器拦截器进行拦截时将调用什么方法。该代码访问 customerId 和方法名称并将它们显示出来。
1 package com.ibm.ejb3.order.session;
2
3 import java.lang.reflect.Method;
4
5 import javax.interceptor.AroundInvoke;
6 import javax.interceptor.InvocationContext;
7
8 public class AuditInterceptor {
9
10 @AroundInvoke
11 public Object audit(InvocationContext invocationContext) throws Exception
12 {
13 Method operation = invocationContext.getMethod();
14 String name = operation.getName();
15 Object param[] = invocationContext.getParameters();
16 System.out.println
17 ("Customer Id " + param[0] + " executing operation => " + name);
18 return invocationContext.proceed();
19 }
20
21 }
2
3 import java.lang.reflect.Method;
4
5 import javax.interceptor.AroundInvoke;
6 import javax.interceptor.InvocationContext;
7
8 public class AuditInterceptor {
9
10 @AroundInvoke
11 public Object audit(InvocationContext invocationContext) throws Exception
12 {
13 Method operation = invocationContext.getMethod();
14 String name = operation.getName();
15 Object param[] = invocationContext.getParameters();
16 System.out.println
17 ("Customer Id " + param[0] + " executing operation => " + name);
18 return invocationContext.proceed();
19 }
20
21 }
您可以通过使用 @Interceptor 注释来注释类,将拦截器添加到会话 Bean 中。为了简便起见,在此练习中可以这样做,但是对于类来说,非常好的实践是不要知道谁在拦截它。EJB 3.0 支持部分 XML 部署描述符,其中您可以定义外部化拦截器与类匹配的拦截器绑定。外部化拦截器通常是非常好的实践。
如下所示,打开 OrderTaskImpl 类并添加 @Interceptors (AuditInterceptors.class)。
1 @Stateless
2 @Interceptors(AuditInterceptor.class)
3 public class OrderTaskImpl implements OrderTask {
2 @Interceptors(AuditInterceptor.class)
3 public class OrderTaskImpl implements OrderTask {
对 CustomerTask 执行相同的操作。
1 @Stateless
2 @Interceptors(AuditInterceptor.class)
3 public class CustomerTaskImpl implements CustomerTask {
2 @Interceptors(AuditInterceptor.class)
3 public class CustomerTaskImpl implements CustomerTask {