spring-cache中proxy限制问题
本周部门同事在处理一个应用的性能优化,其中用到SpringCache来进行部分数据缓存到redis。
由于是优化事项,在开发过程中,一些场景遇到了proxy问题导致的无法进行缓存操作。
这是因为SpringCache的原理是基于动态代理,在方法上进行切面拦截,如果是服务内部进行方法调用或者调用private方法,后调用的方法是无法进入切面处理逻辑的,在日志、事务等场景上也会遇到类似的问题。
这里其实就延伸到了代理的方式,有静态代理和动态代理,在Sprng应用中,通过JDK和CGLIB的方式来实现动态代理,同时也支持通过AspectJ注解来实现面向切面编程,即AOP。
针对刚才的问题,只要能够让调用的方法通过代理对象去触发,就能实现触发缓存操作,通过查询相关的API,发现
AopContext.currentProxy()
可以实现这个目的.
((FooService)AopContext.currentProxy()).someBusMethod();
另外,Spring-cache资料有提到通过基于AspectJ的AOP方式也能做,但这种方式,需要自定义切面的配置和逻辑,个人觉得并不适合优化场景来使用。
参考资料:
http://docs.spring.io/spring/docs/3.0.x/reference/aop.html
http://docs.spring.io/spring/docs/3.0.x/reference/aop.html
http://www.cnblogs.com/xiaoluo501395377/archive/2012/10/20/2732083.html
http://docs.spring.io/spring/docs/3.0.x/reference/aop.html