首页 > 代码库 > Ejb in action(六)——拦截器

Ejb in action(六)——拦截器

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");
		}
	}
}


客户端再次调用时,就会显示服务器端的执行时间。