Ejb拦截器可以监听程序中的一个或所有方法。与Struts2中拦截器同名,而且他们都能够实现切面式服务。同时也与Spring中的AOP技术类似。
不同的是struts2的拦截器的实现原理是一层一层的拦截器包住一个action,拦截Action请求,在自己的拦截器里面自定义内容。
Struts2中的拦截器可以说是个过滤器,把不想要或不想显示的内容过滤掉。拦截器可以抽象出一部分代码用来完善原来的Action,同时可以减轻代码冗余,提高重用率。如一些登录验证、权限限制等。
Spring的两大主要功能就是IoC与AOP。然而Spring 中 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他 Bean 实例作为目标,这种关系可由 IoC 容器的依赖注入提供。Spring 默认使用 Java 动态代理来创建 AOP 代理, 这样就可以为任何接口实例创建代理了。当需要代理的类不是代理接口的时候,
Spring 自动会切换为使用 CGLIB 代理,也可强制使用 CGLIB。
Spring的AOP应用:采用AOP+log4j记录项目日志
然而在分布式项目中,我们无法使用Spring的AOP做到拦截分布式请求。采用Ejb的分布式业务,我们就需要使用Ejb的拦截器了。同很多面向切面的技术一样,Ejb拦截器同样能够完成日志、权限、事务、异常捕获等功能。
在我们gxpt项目中,应用了EJb的拦截器添加缓存:blog.csdn.net/wzwenhuan/article/details/24742039。
为了方便大家更加清晰的掌握Ejb拦截器,我们这个举一个简单的例子:
前文中,我们介绍了一个购物车的例子,现在我们要统计客户端调用一次服务器方法,服务器的响应时间。
接口实现加入注解@Interceptors:
@Remote @Stateful @Interceptors({MyInterceptor.class}) public class StatefulSessionBeanImpl implements IStatefulSessionBean { }
拦截器:
package com.lzq.interceptor; import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; public class MyInterceptor { @AroundInvoke public Object log(InvocationContext ctx) throws Exception { long start = System.currentTimeMillis(); try { if (ctx.getMethod().getName().equals("list")) { System.out.println("list()已经被调用"); } return ctx.proceed(); } catch (Exception e) { throw e; }finally{ long time =System.currentTimeMillis()-start; System.out.println("用时:"+time+"ms"); } } }
客户端再次调用时,就会显示服务器端的执行时间。
Ejb in action(六)——拦截器