我们在使用jpa进行保存数据的时候,有时候业务逻辑需要在保存数据的时候做一些其他的事情,但是又碍于在代码种很多地方调用保存接口,这时候想要每一处去修改保存方法,就显得太冗余,而且容易出错。
其实再这个时候,可以使用切面的方式进行处理
首先声明切点:
@Pointcut(value = "execution(public *javax.persistence.EntityManager.persist(..))")
private void getPointcut(){
}
再这里需要注意 persist通用保存的Object对象
但是我们需要的是对保存Teacher时进行切面,其他不进入切面方法,故做一下修改,再getPointcut()里面增加Teacher对象
切面表达式里面增加args(),参数明对应方法的参数名
//args(teacher) 应为保存很多地方会用到,而且再方法传递时使用的是Obejct对象,所以在表达式
//写Teacher对象时无法进入切面,故需要添加args参数
@Pointcut(value = "execution(public * javax.persistence.EntityManager.persist(..)) && args(teacher)")
private void getPointcut(Teacher teacher){
}
接下来就是对切点进行正常处理就可以了
@Before("getPointcut(teacher)")
private void Before(JoinPoint joinPoint,Teacher teacher){
System.out.println("start");
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
Object target = joinPoint.getTarget();
Object[] args = joinPoint.getArgs();
// throw new RuntimeException("exceotion");
}
@After("getPointcut(teacher)")
private void After(Teacher teacher){
System.out.println("end");
}
经测试,只有在Teacher进行保存的时候才会触发切面方法。