所谓的业务方法调用拦截就是业务方法在调用前或后我们可以插入自己的业务代码进行拦截处理,如果我们需要在操作人员在操作我们的业务模块时,记录操作人员的操作日志,那么就可以通过该功能实现。在BDF2当中,我们通过Spring的AOP方法拦截提供了名为IMethodInterceptor接口,开发人员可以通过实现该接口将其配置到Spring当中即可,IMethodInterceptor接口源码如下:
package com.bstek.bdf2.core.aop; import java.lang.reflect.Method; /** * 实现该接口用于拦截用户感兴趣的业务方法调用,比如作业务操作审计等 * @author Jacky.gao * @since 2013年7月11日 */ public interface IMethodInterceptor { /** * 是否支持当前方法调用 * @param objectClass 调用类class * @param method 调用的方法对象 * @return true表示支持,false表示不支持 */ boolean support(Class<?> objectClass,Method method); /** * 在方法调用之前拦截,如不需要保持实现类中该方法为空即可 * @param objectClass 调用类class * @param method 调用的方法对象 * @param arguments 方法调用时采用的参数集合 * @throws Exception */ void doBefore(Class<?> objectClass,Method method,Object[] arguments) throws Exception; /** * 在方法调用之后拦截,如不需要保持实现类中该方法为空即可 * @param objectClass 调用类class * @param method 调用的方法对象 * @param arguments 方法调用时采用的参数集合 * @param returnValue 方法调用完成后的返回值 * @throws Exception */ void doAfter(Class<?> objectClass,Method method,Object[] arguments,Object returnValue) throws Exception; }
需要注意的是,在使用IMethodInterceptor接口时,我们还需要定义bdf2.globalMethodIntercetporBeanNamesPattern属性,通过该属性来决定我们AOP实现要拦截哪些bean的方法调用,如果不定义该属性,那么默认将不拦截任何bean的方法调用,比如我们可以在dorado-home/configure.properties文件当中将bdf2.globalMethodIntercetporBeanNamesPattern属性值设置为"*Maintain,*Dao",那么就表示将拦截所有bean的id以Maintain结尾的或以Dao结尾的bean的方法调用。可以看到在这个属性值定义时多个值需要用逗号分隔。
下图当中我将在在dorado-home/configure.properties文件当中将bdf2.globalMethodIntercetporBeanNamesPattern属性值设置为"*Maintain,*Dao":
同时我们编写了一个名为TestMethodInterceptor的IMethodInterceptor接口实现类,其源码如下:
package test; import java.lang.reflect.Method; import org.springframework.stereotype.Component; import com.bstek.bdf2.core.aop.IMethodInterceptor; import com.bstek.bdf2.core.context.ContextHolder; import com.bstek.bdf2.core.view.user.UserMaintain; @Component public class TestMethodInterceptor implements IMethodInterceptor { public boolean support(Class<?> objectClass, Method method) { if(objectClass.getName().equals(UserMaintain.class.getName())){ return true; } return false; } public void doBefore(Class<?> objectClass, Method method, Object[] arguments) throws Exception { System.out.println("......before invoke:"+method.getName()); System.out.println("......login user:"+ContextHolder.getLoginUserName()); } public void doAfter(Class<?> objectClass, Method method, Object[] arguments, Object returnValue) throws Exception { System.out.println("......after invoke:"+method.getName()); System.out.println("......return value:"+returnValue); System.out.println("......arguments:"+arguments); } }
启动服务,登录后访问BDF2当中的用户维护界面,可以看到控制台输出的相关拦截信息。