如下的拦截器: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 指点