}
//用于配置当前方法是一个最终通知
@After("execution(* com.example.service.impl.*.*(..))")
public void afterPrintLog(){
System.out.println("最终通知打印日志");
}
//用于配置当前方法是一个后置通知
@AfterReturning("execution(* com.example.service.impl.*.*(..))")
public void afterReturningPrintLog(){
System.out.println("后置通知日志");
}
//用于配置当前方法是一个异常通知
@AfterThrowing("execution(* com.example.service.impl.*.*(..))")
public void afterThrowingPrintLog(){
System.out.println("异常通知打印日志");
}
}
LogUtil.java
* 执行顺序
> 前置通知打印日志
> 保存用户User{id=1, username=‘zs’, password=‘123’, birthday=Sat Jul 24 16:02:21 CST 2021}
> 后置通知日志
> 最终通知打印日志
#### [](
)4.4.6 一个切面内相同类型通知的执行顺序
@Component
//表明当前类是一个切面类
@Aspect
public class LogUtil {
//用于配置当前方法是一个前置通知
@Before("execution(* com.example.service.impl.*.*(..))")
public void before2PrintLog(){
System.out.println("前置通知2打印日志");
}
//用于配置当前方法是一个前置通知
@Before("execution(* com.example.service.impl.*.*(..))")
public void before1PrintLog(){
System.out.println("前置通知1打印日志");
}
}
* 最终执行顺序
> 前置通知1打印日志
> 前置通知2打印日志
> 保存用户User{id=1, username=‘zs’, password=‘123’, birthday=Sat Jul 24 16:20:17 CST 2021}
* 一个切面内相同类型通知的执行顺序与声明顺序无关
* 一个切面内相同类型通知的执行顺序由方法名中每个字符的ASCII码顺序决定
* 个切面内相同类型通知的执行顺序不能用@Order进行控制
#### [](
)4.4.7 @Around
##### [](
)4.4.7.1 作用
* 用于指定环绕通知。
##### [](
)4.4.7.2 属性
* value:用于指定切入点表达式,可以是表达式,也可以是表达式的引用。
* argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称一致。通常不指定也可以获取切入点方法的参数内容。
##### [](
)4.4.7.3 基本使用
public interface UserService {
@Description("保存")
void saveUser(User user);
@Description("查找")
User findById(String id);
@Description("更新")
void update(User user);
@Description("删除")
void delete(String id);
}
UserService.java
/**
- 系统日志的实体类
*/
public class SystemLog implements Serializable {
//主键
private String id;
//方法名称
private String method;
//方法说明
private String action;
//时间
private Date time;
//来访者名称
private String remoteIp;
@Override
public String toString() {
return "Sy