spring的Aop

aaa888
水木总版主 07月31日 字数 86
Java Java技术
13 个回复
Dogfight
熊猫党党魁|贤德淡藤 07月31日

aop也是把拦截器封到一个list

然后作为reflectivemethodinvocation的成员产量

process方法自曾index,递归调用拦截器链,把自身作为参数传入拦截器,拦截器invoke最后又调用process

每个拦截器调用逻辑不一样。

【 在 aaa888 的大作中提到: 】

: 说spring的aop的底层会把这个代理类的对象放到容器里 执行方法的时候会递归调用封装好的Aspect的链条 然后执行原来类的真实方法 spring mvc在执行c

aaa888
水木总版主 07月31日
Dogfight
熊猫党党魁|贤德淡藤 07月31日

因为有round通知

mvc这种只有前置,后置,就可以一次链式处理

有round就有嵌套,处理嵌套还是递归方便些。

【 在 aaa888 的大作中提到: 】

: 是的  递归调用封装好的ASPECT的集合  阿里问为啥不像springmvc的拦截器一样搞  把前

aaa888
水木总版主 07月31日
potator
二篇儿半 08月01日

因为Java语言的限制,做不到呀。

aaa888
水木总版主 08月02日
weizhaokang
奋斗 08月02日

被调用方式不同

controller方法由容器调用,基本就是实例化后通过反射来执行方法,容器在执行时可以有很多手段;

spring bean的方法调用是写在代码里,要编译成字节码,不能在方法调用入口做文章,只能通过代理类来增加bean的功能了。

【 在 aaa888 的大作中提到: 】

: 说spring的aop的底层会把这个代理类的对象放到容器里 执行方法的时候会递归调用封装好的Aspect的链条 然后执行原来类的真实方法 spring mvc在执行contoller方法的时候  会封装拦截器到一个list里 然后循环掉用前置方法 然后执行真实方法 然后循环调用后置方法  说为什么spring搞出个代理类处理  像sprmvc这样处理不行吗

aaa888
水木总版主 08月03日
potator
二篇儿半 08月03日

因为AOP无论你怎么实现,方法签名必须和代理方法一致。

而MVC这块儿没有这个限制。

【 在 aaa888 的大作中提到: 】

: 为啥做不到啊 为啥aop做递归链路调用啊

aaa888
水木总版主 08月04日
canper
洗衣粉 08月04日

赞魏总

【 在 weizhaokang (奋斗) 的大作中提到: 】

: 被调用方式不同

: controller方法由容器调用,基本就是实例化后通过反射来执行方法,容器在执行时可以有很多手段;

: spring bean的方法调用是写在代码里,要编译成字节码,不能在方法调用入口做文章,只能通过代理类来增加bean的功能了。

: ...................

aaa888
水木总版主 08月04日
aaa888
水木总版主 08月04日
poikilotherm
呆子 08月04日

我理解的魏总的意思是controller由容器也就是spring mvc框架调用的,这个调用流程是固定的,所以框架可以自动把需要的拦截器之类的插入到调用链中去。

aop增强的对象是用户自己调用的,调用流程不固定,你弄拦截器从哪儿拦截呢? 而aop通过proxy,可以自动把增加的代码添加进去

【 在 aaa888 的大作中提到: 】

: 魏总说的好深奥啊  没看明白啊

canper
洗衣粉 08月05日

【 在 poikilotherm (呆子) 的大作中提到: 】

: 我理解的魏总的意思是controller由容器也就是spring mvc框架调用的,这个调用流程是固定的,所以框架可以自动把需要的拦截器之类的插入到调用链中去。

: aop增强的对象是用户自己调用的,调用流程不固定,你弄拦截器从哪儿拦截呢? 而aop通过proxy,可以自动把增加的代码添加进去

Dogfight
熊猫党党魁|贤德淡藤 08月05日

你增强的代码就叫interceptor

【 在 poikilotherm 的大作中提到: 】

: 我理解的魏总的意思是controller由容器也就是spring mvc框架调用的,这个调用流程是固定的,所以框架可以自动把需要的拦截器之类的插入到调用链中去。

: aop增强的对象是用户自己调用的,调用流程不固定,你弄拦截器从哪儿拦截呢? 而aop通过proxy,可以自动把增加的代码添加进去

Dogfight
熊猫党党魁|贤德淡藤 08月05日

这个解释足够了,其他都没扯到点上

环绕增强怎么做成链式?执行一次就执行一次目标方法,有多个环绕增强不就多次执行目标方法。

没法for循环按照chain跑完,实际spring mvc也是双list实现简单栈,他只有pre post complete逻辑。

就算没看过代码,对方一问递归就应该想到栈实现

【 在 aaa888 的大作中提到: 】

: 大神  你说的 这个怎么理解啊   不太懂啊  能讲具体点吗

:  因为有round通知

: mvc这种只有前置,后置,就可以一次链式处理

: ...................

canper
洗衣粉 08月05日

其实也是可以的,就看更愿意选择哪种方式来实现而已

【 在 Dogfight (熊猫党党魁|贤德淡藤) 的大作中提到: 】

: 这个解释足够了,其他都没扯到点上

: 环绕增强怎么做成链式?执行一次就执行一次目标方法,有多个环绕增强不就多次执行目标方法。

: 没法for循环按照chain跑完,实际spring mvc也是双list实现简单栈,他只有pre post complete逻辑。

: ...................

javartisan
javartisan 08月07日

Spring MVC 里面有统一入口是DispatchServlet,而AOP没有统一接口,如果所有Spring方法调用有一个类似于网关的统一入口,也是没什么问题的。(Spring MVC 拦截器链如果有一个返回false直接就返回来,没有执行后置处理逻辑,真要实现需要做改造)除此之外:而且MVC偏向于静态代理;而Spring AOP偏向于动态代理。

【 在 aaa888 的大作中提到: 】

: 说spring的aop的底层会把这个代理类的对象放到容器里 执行方法的时候会递归调用封装好的Aspect的链条 然后执行原来类的真实方法 spring mvc在执行contoller方法的时候  会封装拦截器到一个list里 然后循环掉用前置方法 然后执行真实方法 然后循环调用后置方法  说为什么spring搞出个代理类处理  像sprmvc这样处理不行吗