如下的拦截器:TestInterceptor
public class TestInterceptor implements Interceptor { private TestServiceInterface testService; //带参构造方法,传入相应的服务对象 public TestInterceptor(TestServiceInterface service){ this.testService = service; } public void intercept(Invocation inv) { //执行逻辑处理 service.dosomething("..."); //调用目标方法 inv.invoke(); } }
这个拦截器很简单,就是增加了一个接口类型的带参实例方法,目的是通过传入的服务对象在拦截器内部进行可定制的逻辑处理,这样的话,不同项目中,相同功能的拦截器可以剥离出来,只需要在实例化时注入服务对象就可以了
我已经在项目中这么用了,只是以前都是定义成全局控制器:
public void configInterceptor(Interceptors me) { me.add(new TestInterceptor(new UserService())); }
现在需要定义成Class级控制器,利用@Before时,发现无法给拦截器传入参数。
分析JFinal初始化拦截器的源码:InterceptorManager.class 154行
public Interceptor[] createInterceptor(Class<? extends Interceptor>[] interceptorClasses) { if (interceptorClasses == null || interceptorClasses.length == 0) { return NULL_INTERS; } Interceptor[] result = new Interceptor[interceptorClasses.length]; try { for (int i=0; i<result.length; i++) { result[i] = singletonMap.get(interceptorClasses[i]); if (result[i] == null) { result[i] = (Interceptor)interceptorClasses[i].newInstance(); singletonMap.put(interceptorClasses[i], result[i]); } } return result; } catch (Exception e) { throw new RuntimeException(e); } }
发现没办法对带参的拦截器进行反射
也没办法重写这个InterceptorManager
遇到障碍了,还请 @JFinal 指点