基于注解的AOP之切入点表达式的语法和获取连接点的信息以及切入点表达式的重用
1.切入点表达式的语法
①作用
②语法细节
-
用*号代替“权限修饰符”和“返回值”部分表示“权限修饰符”和“返回值”不限
-
在包名的部分,一个“*”号只能代表包的层次结构中的一层,表示这一层是任意的。
- 例如:*.Hello匹配com.Hello,不匹配com.atguigu.Hello
-
在包名的部分,使用“*..”表示包名任意、包的层次深度任意
-
在类名的部分,类名部分整体用*号代替,表示类名任意
-
在类名的部分,可以使用*号代替类名的一部分
- 例如:*Service匹配所有名称以Service结尾的类或接口
-
在方法名部分,可以使用*号表示方法名任意
-
在方法名部分,可以使用*号代替方法名的一部分
- 例如:*Operation匹配所有方法名以Operation结尾的方法
-
在方法参数列表部分,使用(..)表示参数列表任意
-
在方法参数列表部分,使用(int,..)表示参数列表以一个int类型的参数开头
-
在方法参数列表部分,基本数据类型和对应的包装类型是不一样的
- 切入点表达式中使用 int 和实际方法中 Integer 是不匹配的
-
在方法返回值部分,如果想要明确指定一个返回值类型,那么必须同时写明权限修饰符
-
例如:execution(public int ..Service.*(.., int)) 正确
-
例如:execution(* int ..Service.*(.., int)) 错误
-
2.获取连接点的信息
- 获取连接点信息可以在通知方法的参数位置设置JoinPoint类型的形参
// @Before("execution(public int com.atguigu.spring.aop.annotation.CalculatorImpl.add(int ,int))")
@Before("execution(* com.atguigu.spring.aop.annotation.CalculatorImpl.*(..))")
public void beforeAdviceMethod(JoinPoint joinPoint){
//获取连接点所对应方法的签名信息(方法的声明信息)
Signature signature = joinPoint.getSignature();
//获取连接点所对应方法的实参信息
Object[] args = joinPoint.getArgs();
System.out.println("LoggerAspect,方法:"+signature.getName()+",参数:"+ Arrays.toString(args));
}
3. 切入点表达式的重用
① @Pointcut 声明一个重用的切入点表达式
@Pointcut("execution(* com.atguigu.spring.aop.annotation.CalculatorImpl.*(..))")
public void pointCut(){}
②在同一个切面中使用
@Before("pointCut()")
public void beforeAdviceMethod(JoinPoint joinPoint){
//获取连接点所对应方法的签名细信息(方法的声明信息)
Signature signature = joinPoint.getSignature();
//获取连接点所对应方法的实参信息
Object[] args = joinPoint.getArgs();
System.out.println("LoggerAspect,方法:"+signature.getName()+",参数:"+ Arrays.toString(args));
}
③在不同切面中使用
@Before("com.atguigu.spring.aop.annotation.LoggerAspect.pointCut()")
public void beforeAdviceMethod(JoinPoint joinPoint){
//获取连接点所对应方法的签名细信息(方法的声明信息)
Signature signature = joinPoint.getSignature();
//获取连接点所对应方法的实参信息
Object[] args = joinPoint.getArgs();
System.out.println("LoggerAspect,方法:"+signature.getName()+",参数:"+ Arrays.toString(args));
}