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拦截器,我们这个举一个简单的样例:

前文中,我们介绍了一个购物车的样例,如今我们要统计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端的运行时间。


原文地址:https://www.cnblogs.com/yutingliuyl/p/7235973.html