源代码
- 定义一个PaymentService,PaymentServiceImpl实现类
@Service
@AllArgsConstructor
@Slf4j
public class PaymentServiceImpl extends ServiceImpl<PaymentMapper, Payment>
implements PaymentService {
@Override
public void toPayment(Payment payment) {
this.save(payment);
}
}
- 定义AOP,在save()方法调用之前对实体类进行预处理(将实体类中中某些属性进行初始化)
@Aspect
@Component
public class PaymentHandlerAspect {
@Pointcut("execution(* com.jerry.payment.service.PaymentService.save(..))")
public void beforeSave() {
}
@Before("beforeSave() && args(payment)")
public void beforeSave(JoinPoint joinPoint, Payment payment) {
payment.setCreateUser(userInfo.getId());
payment.setUpdateUser(userInfo.getId());
payment.setCreateTime(new Date());
payment.setUpdateTime(new Date());
payment.setIsDeleted(0);
}
}
结果没有运行相关代码,则AOP失效
原因分析
在AOP所有的增强逻辑之后,都会被代理对象作为实例调用真实的方法
- this指针指的是原始对象,而不是代理对象
- 只有代理对象才拥有增强的逻辑
解决
- 通过AopContext来获取代理对象,在启动类中添加注解@EnableAspectJAutoProxy(exposeProxy = true)
- fun()方法改成:
@Service
@AllArgsConstructor
@Slf4j
public class PaymentServiceImpl extends ServiceImpl<PaymentMapper, Payment>
implements PaymentService {
@Override
public void toPayment(Payment payment) {
this.save();
PaymentService paymentService = (PaymentService) AopContext.currentProxy();
paymentService.save(payment);
}
}