目的:让子类和父类的拦截器都执行。
现在有一个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(...) 无需配置即可支持注入。