起因:由于系统要集成memcached实现缓存服务,java客户端选用xmemcache,本来想集成spring的缓存注解,@Cacheabale,@CachePut,@Cacheevict,但是由于项目中spring版本不够无法使用上面注解,而且版本又不能升级,为了系统的稳定性。
解决办法:为了不想把缓存的操作,侵入业务代码,于是就模仿自定义上面三个注解,并且支持spring el表达式来动态获取方法参数来封装key,表达式解析用SpelExpressionParser类处理
问题:1:在切面处理中无法拿到目标类的执行方法,因为是是基于jdk 动态代理实现切面拦截,接口里是泛型方法,于是我在切面拿到的是桥接方法,不是真实调用方法,通过看spring 源码发现BridgeMethodResolver 类的findBridgedMethod 可以通过桥接方法获取目标方法。
2:拿到目标方法后,由于要获取方法参数名称来封装缓存key,但通过反射无法拿到方法的参数名称,继续查看spring 源码 ,发现可以通过LocalVariableTableParameterNameDiscoverer 来处理,原理好像是通过ASM 字节码码增强工具来获取目标方法参数名称。