概述
背景
我们知道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列表依次增强的传递性,参考时序图。
总结
spring通过组合的方式,使动态代理的实现 和 目标方法被代理后的调用进行了解耦,实现了可扩展性。实现了Proxy接口的类,只负责对方法进行相关逻辑的增强。目标方法代理调用通过包含了 一个 包含了实现多个proxy接口的集合 的ProxyChain来实现。接下来就需要通过IOC对目标类和ProxyChain进行关联,在调用相关方法时,直接调用被代理包装后方法。
demo地址:https://github.com/stunode/demo
最后
以上就是耍酷路人为你收集整理的详解aop之interceptor模式的全部内容,希望文章能够帮你解决详解aop之interceptor模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复