切入点表达式回顾
切入点表达式代码
导入第三方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;
}
}