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拦截器,我们这个举一个简单的样例:
前文中,我们介绍了一个购物车的样例,如今我们要统计client调用一次server方法,server的响应时间。
接口实现增加注解@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"); } } }
client再次调用时,就会显示server端的运行时间。