1.Maven导入包
<!-- aop 切面 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.自定义注解
/**
* @Auther: yoult
* @Description: TODO
* @LoginName: ZDGG
* @Date: 2020-09-18 9:19 星期五
*
*/
// 声明可以使用该注解的目标类型
@Target({ElementType.METHOD, ElementType.TYPE})
// 声明注解的保留期限
@Retention(RetentionPolicy.RUNTIME)
public @interface AopDemoAspect {
String param() default "";
}
3.定义切面运行方法
/**
* @Auther: yoult
* @Description: TODO
* @LoginName: ZDGG
* @Date: 2020-09-18 9:14 星期五
*/
@Aspect
@Component
public class AopAspect {
/**
* 方法执行循环通知,用于对方法运行前和运行后进行处理
* @param pjp
* @param aopDemoAspect
* @return
* @throws Throwable
*/
@Around("@annotation(aopDemoAspect)")
public Object around(ProceedingJoinPoint pjp, AopDemoAspect aopDemoAspect) throws Throwable {
//获取参数
Object[] args = pjp.getArgs();
// 方法运行前可在此处进行处理
System.out.println("around front");
// 运行注解所标记的方法
Object obj = pjp.proceed();
System.out.println("around after");
// 方法运行后可在此处进行处理
return obj;
}
/**
* 方法执行前通知
* @param pjp
* @param aopDemoAspect
*/
@Before("@annotation(aopDemoAspect)")
public void before(JoinPoint pjp, AopDemoAspect aopDemoAspect){
System.out.println("@Before:模拟权限检查...");
//获取参数
Object[] args = pjp.getArgs();
System.out.println("before");
}
/**
* 方法执行后通知
* @param pjp
* @param aopDemoAspect
*/
@After("@annotation(aopDemoAspect)")
public void after(JoinPoint pjp, AopDemoAspect aopDemoAspect){
//获取参数
System.out.println("@After:模拟释放资源...");
Object[] args = pjp.getArgs();
System.out.println("after");
}
/**
* 方法正常退出后执行后通知
* @param pjp
* @param aopDemoAspect
*/
@AfterReturning("@annotation(aopDemoAspect)")
public void afterReturning(JoinPoint pjp, AopDemoAspect aopDemoAspect){
System.out.println("@AfterReturning:模拟日志记录功能...");
//获取参数
Object[] args = pjp.getArgs();
System.out.println("afterReturning");
}
/**
* 方法异常退出后执行后通知
* @param pjp
* @param aopDemoAspect
*/
@AfterThrowing("@annotation(aopDemoAspect)")
public void afterThrowing(JoinPoint pjp, AopDemoAspect aopDemoAspect){
//获取参数
Object[] args = pjp.getArgs();
System.out.println("afterThrowing");
}
}
- @Aspect:作用是把当前类标识为一个切面供容器读取
- @annotation(annotationType):匹配指定注解为切入点的方法
- JoinPoint:方法中的参数JoinPoint为连接点对象,它可以获取当前切入的方法的参数、代理类等信息
- 执行顺序为:around front -> before -> (方法运行) -> around after -> afterReturning / afterThrowing -> after
- 可使用 &&、||、!、三种运算符来组合切点表达式,表示与或非的关系
4.注解使用
/**
* @Auther: yoult
* @Description: TODO
* @LoginName: ZDGG
* @Date: 2020-09-26 10:07 星期六
*/
@Component
public class AopDemoService {
@AopDemoAspect
public String aopDemo(String name){
return "success:" + name;
}
}
@AopDemoAspect 注解标注静态方法无效