@Aspect:用于定义切面
@Pointcut:用于定义切入点,而使用时还需要定义一个包含名字和任意参数的方法签名来表示切入点名称
实际上这个方法签名就是一个返回值为void,且方法为空的普通方法
@Before:用于配置前置通知,在使用时要定义一个value属性值,该属性值用于指定一个切入点表达式
@AfterReturning:用于定义后置通知
@Around:用于配置环绕通知
@AfterThrowing:用于配置异常通知
@After:用于配置最终通知
实例代码:
1)编写接口和实现类
2)切面类
// 切面类
@Aspect
@Component
public class MyAspect {
// 定义切入点
@Pointcut("execution(* com.bdqn.cn.dao.UserDaoImpl.*(..))")
private void myPointcut(){}
// 前置通知
@Before("myPointcut()")
public void myBefore(JoinPoint joinPoint){
System.out.println("前置通知:做一个检查动作...");
System.out.println("目标类:"+joinPoint.getTarget());
System.out.println("被植入的目标方法:"+joinPoint.getSignature().getName());
}
// 后置通知
@AfterReturning("myPointcut()")
public void myAfterReturning(JoinPoint joinPoint){
System.out.println("后置通知:模拟日志记录...");
System.out.println("被植入的目标方法:"+joinPoint.getSignature().getName());
}
/*
* 环绕通知
* ProceedingJoinPoint 是 JoinPoint的子接口,表示可以执行目标方法
* 1、必须是Object返回值类型
* 2、必须接收一个参数,类型为ProceedingJoinPoint
* 3、必须throws Throwable
*
*/
@Around("myPointcut()")
public Object myArround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
// 开始
System.out.println("环绕开始:执行目标方法之前,模拟开启事务...");
// 执行当前目标方法
Object obj = proceedingJoinPoint.proceed();
// 结束
System.out.println("环绕结束:执行目标方法之后,模拟关闭事务...");
return obj;
}
// 异常通知
@AfterThrowing(value="myPointcut()",throwing="e")
public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
System.out.println("异常通知:出错了"+e.getMessage());
}
// 最终通知
@After("myPointcut()")
public void myAfter(){
System.out.println("最终通知:模拟方法结束后的释放资源...");
}
}
3)配置文件
4)测试类