项目开发过程中,总会出现一些公共性的基础性服务。例如:日志、事务等等。即使在之前的OO的开发过程中,利用封装、继承、多态这些特性已经使开发趋于这样一个比较易扩展、易维护的开发流程。但是对于这些公共性的服务,开发者越来越发现这些代码总是在不断的重复。所以AOP应势而生,基于切面编程其实基于OO这样一个开发理念而形成的。好了,关于AOP的充电过程自行去了解。
直入正题,本文主要是通过interceptor结合ejb的client调用server来实现这样一个aop的效果。
项目驱动,简单介绍一下大体过程。
1.将相应的切面服务注册到jboss container中管理
2.在需要使用到服务的地方注入interceptor。
基本就是这样一个流程,比较简单。还是直接看代码。
package com.cfl.aop.interceptor;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class InterceptorCommonService {
@AroundInvoke
public Object interceptorMethod(InvocationContext ic) throws Exception {
System.out.println("InterceptorCommonService -----------excuting!excuting!excuting!excuting!-------------:" + ic.getMethod().getName());
return ic.proceed();
}
}
这是一个可被注入的拦截器类,在被需要注入公共服务类的上配置注解即可。
@Stateless
@Interceptors({InterceptorCommonService.class, InterceptorCommonService2.class})
//@Interceptors(InterceptorCommonService.class)
@Remote
public class LoginBeanimpl {
***;
@AroundInvoke
public String loggerImpl{
***;
}
@ExcludeClassInterceptors
public String veritfy(User user) {
***;
}
public void login(){
***;
}
}
LoginBeanimpl被注入InterceptorCommonService
InterceptorCommonService2 两个拦截器,则在执行本身的方法之前都会先去执行两个拦截器中的方法。而@ExcludeClassInterceptors
用来阻止拦截器对某个Bean方法进行拦截。如:上述代码中被注入拦截器的LoginBeanimpl类中的veritfy方法在执行时不会被拦截。通过这个注解的英文意思也可以体会到。再次感受到英文的重要性啊。@AroundInvoke
主要是类中的拦截方法,就是在LoginBeanimpl的login方法在执行会执行loggerImpl先。
相比spring的aop实现,拦截器在灵活性上做的还不及spring的实现。但是针对切面编程的思路都是异曲同工的,还有就是interceptor并没有依赖一些框架,可以说在移植上是非常通用的。