完整写法:execution(方法的修饰符 方法的返回值 类的全类名.方法名(参数))
支持通配符的写法:
* : 标识任意字符串
.. : 任意重复次数
1. 方法的修饰符可以省略:
2. 返回值可以使用*号代替:标识任意返回值类型
3. 包名可以使用*号代替,代表任意包(一层包使用一个*)
4. 使用..配置包名,标识此包以及此包下的所有子包
5. 类名可以使用*号代替,标识任意类
6. 方法名可以使用*号代替,表示任意方法
7. 可以使用..配置参数,任意参数
导入第三方jar包 <!-- 切入点表达式 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.8</version> </dependency> 切入点表达式: 作用: 找到需要增强的方法 格式: 修饰符 返回值 包名.类名.方法名称(参数列表) public void com.village.service.impl.AccountServiceImpl.save()) 规则: * : 标识任意字符串 .. : 任意重复次数 public void com.village.service.impl.AccountServiceImpl.save(..) 1. 方法的修饰符可以省略: void com.village.service.impl.AccountServiceImpl.save(..) 2. 返回值可以使用*号代替:标识任意返回值类型 * com.village.service.impl.AccountServiceImpl.save(..) 3. 包名可以使用*号代替,代表任意包(一层包使用一个*) * com.village.*.*.AccountServiceImpl.save(..) 4. 使用..配置包名,标识此包以及此包下的所有子包 * com..AccountServiceImpl.save(..) 不建议 5. 类名可以使用*号代替,标识任意类 * com.village.*.*.*.save(..) 6. 方法名可以使用*号代替,表示任意方法 * com.village.*.*.*.*(..) * *.*.*.*.*(..) 不要 7. 可以使用..配置参数,任意参数 最终建议格式: * com.village.service.*.AccountServiceImpl.*(..)
切面类代码
/** * 此类为通知类: * 在该类中定义了,各种通知需要调用的相关方法 */ @Component("myAspect") @Aspect // 声明此类为切面类(通知类) public class MyAspect { /** * 定义一个无参无返回值的方法 * 在方法上添加@Pointcut注解,用于定义切入点表达式 * 引用时,只需要使用当前方法的名称() pt() */ @Pointcut("execution(* com.village.service.impl.*.*(..))") public void pt(){} /** * 前置通知调用的方法 */ //@Before("pt()") public void before(){ System.out.println("前置通知...111111111111"); } /** * 后置通知调用的方法 */ //@AfterReturning("pt()") public void afterReturning(){ System.out.println("后置通知...2222222222222"); } /** * 异常通知调用的方法 */ //@AfterThrowing("pt()") public void afterThrowing(){ System.out.println("异常通知...33333333333333"); } /** * 最终通知调用的方法 */ //@After("pt()") public void after(){ System.out.println("最终通知...44444444444444"); } /** * 环绕通知调用的方法 */ @Around("pt()") public Object around(ProceedingJoinPoint joinPoint){ Object result = null; try { System.out.println("前置通知..."); // 相当于 方法字节码对象.invoke(); // 让原方法执行 result = joinPoint.proceed(); System.out.println("后置通知..."); } catch (Throwable throwable) { throwable.printStackTrace(); System.out.println("异常通知..."); }finally { System.out.println("最终通知...44444444444444"); } return result; } }