spring-cache中proxy限制问题

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

留下回复