webx处理请求与Spring aop
webx在启动时通过:
com.alibaba.citrus.webx.servlet.WebxFrameworkFilter.init()==>ServletContext. getAttribute(attrName)
获取WebxComponentsContext。?
后续调用过程:
WebxRootControllerImpl. handleRequest()
?
getComponents().findMatchedComponent(path).getWebxController().service(requestContext)
?
在service中:
?
PipelineInvocationHandle. Invoke()==>valve.invoke(this)
?
valve就是在pipeline中配置的阀门。
?
?
?
由于我们需要在screen层加一层aop:
?这时,如果screen实现的有接口,则screen所对应的bean应该是通过jdk动态代理创建的。例如:LoginScreen implements ILogin
?
?那边LoginScreen的bean实例:org.springframework.aop.framework.JdkDynamicAopProxy@a634f0e这时就会出现异常:
??抛出异常的代码:
?
?应该是 adapter.adapt(moduleType, moduleName, moduleObject)出现了问题?
? if (handlers == null) {//debug发现,是这里返回了null
??????????? return null;
??????? }
再看看getEventHandlers():?由于jdk动态代理产生的实例包含的方法来源于其所实现的接口,而ILogin接口中没有任何方法,更不会有以do开头的方法,所以getEventHandlers()返回null,导致异常。。解决方案:
?? 如果不想对screen中的所有do*()都定义接口,那么可以采用cglib做代理,只需要保证screen没有实现任何接口,spring就会自动使用cglib做代理,cglib是通过创造子类来实现代理的,所以代理子类肯定有do*()方法,getEventHandlers()就会返回do开头的方法map,就能够正常处理请求。
?
?
?