详解aop之interceptor模式

背景

我们知道aop是spring的一个重要特性,他的重要提醒是切面增强,可以在一个方法执行前和执行后增加一些额外的功能,比如执行前进行权限验证,执行后进行方法执行时间统计等。当然可以在一个方法上添加多个拦截,这时候我们可以把拦截器存放在一个list中,在方法执行前,依次执行拦截器的前置增强-执行方法-后置增强。
对具体方法增强时,静态代理无法实现通用性,所以需要需要用到动态代理技术,也就是通过java的反射获得具体的执行方法,在反射调用方法执行前和执行后添加一些逻辑,可以参考网上的其他教程。这里主要介绍添加多个拦截器的spring实现。

需要实现的目标

对任意目标方法进行代理,增强的方法具有可扩展性,也就是说对一个目标方法可以进行多层代理

spring中的interceptor模式

spring通过ProxyManager对代理类进行管理,其中包括一个实现了proxy接口的list。
可以看到,通过proxyManager对具体方法进行代理包装,有一个creatProxy的方法,返回被代理后的方法,这个方法即对原方法增强后的方法。
creatProxy实际对proxyChain进行调用,在proxychain中包含一个实现了Proxy接口的集合,proxy为代理接口,主要实现对方法增强的逻辑,包括doProxy(),before(),after()等接口。
proxy实现类中需要包含一个proxyChain,doProxy方法通过调用proxyChain的doProxyChain方法以实现proxy列表依次增强的传递性,参考时序图。

uml
时序图

总结

spring通过组合的方式,使动态代理的实现 和 目标方法被代理后的调用进行了解耦,实现了可扩展性。实现了Proxy接口的类,只负责对方法进行相关逻辑的增强。目标方法代理调用通过包含了 一个 包含了实现多个proxy接口的集合 的ProxyChain来实现。接下来就需要通过IOC对目标类和ProxyChain进行关联,在调用相关方法时,直接调用被代理包装后方法。
demo地址:https://github.com/stunode/demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值