专业建筑工程网站,怎么买域名自己做网站,浙江网站优化公司,wordpress模板+企业1. 问题描述 Spring-mvc和Spring-boot中aop可以实现代理的功能#xff0c;我们可以借此实现事务和日志记录或者限流等多种操作。但是#xff0c;如果你在一个方法中调用其同类下的其他方法的时候不会触发AOP。本文主要说明其原因及解决办法和实现原理。
2. 原因 AIOP的本质是…1. 问题描述 Spring-mvc和Spring-boot中aop可以实现代理的功能我们可以借此实现事务和日志记录或者限流等多种操作。但是如果你在一个方法中调用其同类下的其他方法的时候不会触发AOP。本文主要说明其原因及解决办法和实现原理。
2. 原因 AIOP的本质是我们获取代理对象该对象执行方法的时候我们对其进行增强操作。例如下图示例1中bicycle对象执行drive方法的时候我们对其执行了增强。但是如果我们在示例2中调用同类的其他方法的时候本质使用this.drive()此处的this是真实对象bicycle而不是代理对象cglibProxy因而不会进行增强。 3. 解决办法
3.1 直接从spring容器中获取 参考下图中方法all1SpringUtils实现代码参考 SpringUtils
3.2 借助Aspectj获取代理对象 参考下图中方法all2 4. 解析 SpringUtils直接是创建对象后在spring容器中管理便于理解。此处主要解析3.2。在启动类添加EnableAspectJAutoProxy(exposeProxy true, proxyTargetClass true)后可以发现在调用spring对象方法之前会先进入CglibAopProxy中并将当前spring对象放到ThreadLocal中使用的时候直接从threadLocal中取即可。相关源码贴图如下。
4.1 org.springframework.aop.framework.CglibAopProxy 4.2 org.springframework.aop.framework.AopContext 5. 总结 两种方法都是直接获取代理对象调用目的方法达到方法增强的目的并且都是相对成熟的实现方案。但是个人更喜欢前者(springUtils获取)原因在于无侵入且大部分项目都会自定义该工具。后者相对于前者或多或少存在一点开销。