在进入实例之前,可以先看我引用的另一篇文章:
一. SpringBoot引入AOP依赖
引入依赖:
org.springframework.boot
spring-boot-starter-aop
二. 创建AOP切面类,直接上代码
这里为了简单明了,我将切面类分为普通类方法切面和自定义注解方法切面
1. 普通类方法切面类
package com.example.demo.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* @program: demo
* @description: 描述UserService切面类
* @author: guoxu
* @create: 2019-12-23 14:22
*/
@Slf4j
@Aspect
@Component
public class AopUserServiceAspect {
/**
* 1.通配符
* [*] 匹配任意字符,但只能匹配一个元素
* [..] 匹配任意字符,可以匹配任意多个元素,表示类时,必须和*联合使用
* [+] 必须跟在类名后面,如Horseman+,表示类本身和继承或扩展指定类的所有类
* 切点表达式分为 修饰符 返回类型 包路径 方法名 参数
* 2.切点表达式
* 3.逻辑运算符
* 表达式可由多个切点函数通过逻辑运算组成
* && 与操作,求交集,也可以写成and
* 例如 execution(* chop(..)) && target(Horseman) 表示Horseman及其子类的chop方法
* || 或操作,任一表达式成立即为true,也可以写成 or
* 例如 execution(* chop(..)) || args(String) 表示名称为chop的方法或者有一个String型参数的方法
* ! 非操作,表达式为false则结果为true,也可以写成 not
* 例如 execution(* chop(..)) and !args(String) 表示名称为chop的方法但是不能是只有一个String型参数的方法
*/
/**
* 切点为UserServiceImpl类下的queryUser方法
* "execution(* com.example.demo.service.impl.UserServiceImpl.queryUser())"
*
* 切点为UserServiceImpl类下的所有带任意参数的方法
*/
@Pointcut("execution(* com.example.demo.service.impl.UserServiceImpl.*(..))")
public void userServicePoc(){
}
/**
* 环绕通知在 target 开始和结束执行
* 如果在环绕通知方法中有异常捕获