首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

webx处置请求与Spring aop

2013-07-09 
webx处理请求与Spring aopwebx在启动时通过:com.alibaba.citrus.webx.servlet.WebxFrameworkFilter.init()

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,就能够正常处理请求。

?

?

?

热点排行