Spring AOP拦截失败
内部方法调用绕过AOP
- 代码
- 问题分析
- 解决
代码
使用AOP拦截不到注解标注的方法
public UserRequirement createOrupdate(UserRequirement userRequirement) {if(null == userRequirement.getId()){return this.create(userRequirement);}return this.update(userRequirement);}@UpdateFieldLogpublic UserRequirement update(UserRequirement userRequirement) {//………………………………return returnUserRequirement;}
问题分析
核心问题:this自调用导致代理失效
Spring AOP的实现原理是 基于代理的增强,而通过this关键字进行的内部调用会直接调用目标对象的原始方法,绕过了代理对象,导致切面无法拦截。这是Spring AOP的固有局限性。
解决
通过代理对象调用
public UserRequirement createOrupdate(UserRequirement userRequirement) {if(null == userRequirement.getId() ){return this.create(userRequirement);}return getProxy().update(userRequirement);
}private UserRequirementService getProxy() {return (UserRequirementService) AopContext.currentProxy();
}