之前做过一个业务是关于一个合同明细的作废、取消作废、确认等操作之后会相应的更改合同状态,做的时候考虑了一下,在每个业务方法里加这个操作比较麻烦,而且操作又相同,没必要,就决定用切面的方式来进行这个操作,主要是用后置通知,因为合同状态的更改都是在其作废、取消作废等这些操作之后来完成的。
下面上代码来看看吧:
@Aspect
@Component
public class RdAmortizationDetailAspect {
@Resource
private RdAmortizationDetailMapper rdAmortizationDetailMapper;
@Resource
private IRdContractService rdContractService;
/**
* 后置通知-摊销明细作废后更改合同状态条件
*/
@AfterReturning(value = "execution(* *..RdAmortizationDetailServiceImpl.invalid(..))")
public void printInvalidAfterSuccess(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
List<Long> ids = (List<Long>) args[0];
List<RdAmortizationDetail> list = rdAmortizationDetailMapper.selectList(Wrappers.<RdAmortizationDetail>update().lambda().in(RdAmortizationDetail::getId, ids));
invalidOrConfirmContract(list);
}
/**
* 后置通知-摊销明细取消作废后更改合同状态条件
*/
@AfterReturning(value = "execution(* *..RdAmortizationDetailServiceImpl.cancelInvalid(..))")
public void printCancelInvalidAfterSuccess(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
List<Long> ids = (List<Long>) args[0];
List<RdAmortizationDetail> list = rdAmortizationDetailMapper.selectList(Wrappers.<RdAmortizationDetail>update().lambda().in(RdAmortizationDetail::getId, ids));
invalidOrConfirmContract(list);
}
/**
* 后置通知-摊销明细确认后更改合同状态条件
*/
@AfterReturning(value = "execution(* *..RdAmortizationDetailServiceImpl.confirm(..))")
public void printConfirmAfterSuccess(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
List<RdAmortizationDetail> rdAmortizationDetails = (List<RdAmortizationDetail>) args[0];
invalidOrConfirmContract(rdAmortizationDetails);
}
private void invalidOrConfirmContract(List<RdAmortizationDetail> rdAmortizationDetails){
//业务处理逻辑代码
......
}
}
@Aspect
此注解位于类前,表示面向切面,即这个类可使用切面编程,降低系统耦合性。
@AfterReturning(value = "execution(* *..RdAmortizationDetailServiceImpl.invalid(..))")
此注解表示后置通知,execution中是方法路径,意思是在invalid方法执行完后,先执行此后置通知方法,再返回。
joinPoint.getArgs();
此方法表示获取使用此后置通知方法的参数。