- 在pom.xml中添加依赖
<!--aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 自定义注解,后面直接通过在方法上加注解即可,在cxsbg包下新建aop包,在aop包中添加InvokeLog注解
package com.cxsbg.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //注解用到的地方,比如注解用在方法上
@Retention(RetentionPolicy.RUNTIME) //注解在什么时候,比如runntime
public @interface InvokeLog {
}
- 定义切面类,首先要定义切点,承载刚定义的注解,然后定义增前方法
package com.cxsbg.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Aspect //标识这是一个切面类
@Component
public class InvokeLogAspect {
//确定切点,承载注解,即哪些注解用到这个切面类
@Pointcut("@annotation(com.cxsbg.aop.InvokeLog)")
public void pt(){}
//通知方法
@Around("pt()") //加了InvokeLog注解的方法都会调用该方法
//参数joinPoint表示正在运行中的被增强的方法
public Object printInvokeLog(ProceedingJoinPoint joinPoint) {
//目标方法调用前
System.out.println();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
System.out.println(methodName + "即将被调用");
Object proceed = null;
try {
proceed = joinPoint.proceed();
//目标方法调用后
System.out.println(methodName + "调用结束");
} catch (Throwable e) {
e.printStackTrace();
//目标方法调用出现异常
System.out.println(methodName + "出现异常");
}
return proceed;
}
}
- 在方法上加上该注解
@Override
@InvokeLog //需要被增强的方法加上对应的注解
public List<User> findAll() {
return userMapper.findAll();
}