目的:让子类和父类的拦截器都执行。
现在有一个BaseService类,增加了如下拦截器:
@Before({Base01Interceptor.class, Base02Interceptor.class, Base03Interceptor.class})
public class BaseService {
}然后其子类增加了如下拦截器:
@Before(OtherInterceptor.class)
public class IndexService extends BaseService {
public Ret testFunction(String key, String value) {
return Ret.create().set(key, value);
}
}然后在Controller里注入了:
@Inject IndexService indexService;
现在是只能执行OtherInterceptor拦截器里的代码,父类里的三个拦截器代码都不执行。
如果把OtherInterceptor去掉,则父类的三个拦截器都会执行
如果把@Before(OtherInterceptor.class)放到子类的的方法前面,类似如下:
public class IndexService extends BaseService {
@Before(OtherInterceptor.class)
public Ret testFunction(String key, String value) {
return Ret.create().set(key, value);
}
}则上述四个拦截器都会被执行。
经过波总和杜总的帮助,是说java自身的问题。我经过摸索发现通过如下方法可以那到子类和父类上的拦截器:
@Before(OtherInterceptor.class)
public class IndexService extends BaseService {
public Ret testFunction(String key, String value) {
Before before1 = IndexService.class.getAnnotation(Before.class);
//这里可以递归直到getSuperclass()返回的是Object,我这里只是测试拿父类。
Before before2 = IndexService.class.getSuperclass().getAnnotation(Before.class);
//
Class<? extends Interceptor>[] classList = before1.value();
Ret ret = Ret.create();
int i=1;
for(Class<? extends Interceptor> clazz : classList) {
ret.put("IndexService"+(i++), clazz.getName());
}
//
i=1;
classList = before2.value();
for(Class<? extends Interceptor> clazz : classList) {
ret.put("BaseService"+(i++), clazz.getName());
}
return ret;
}
}@JFinal @杜福忠
有没有可能在jfinal内做一下改进?
项目:JFinal
以上的 me.setInjectDependency(true) 仅是针于 jfinal 的 web 组件而言的配置。而 Aop.get(...)、Aop.inject(...) 无需配置即可支持注入。