1,注入依赖
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
2,编写配置类
@Aspect//标识切面类
@Component
public class AopConfig {
//切点
@Pointcut("execution(public * com.tianji.aopdemo.service..*.*(..))")
private void pt(){}
// @Before()前置通知
// @After()后置通知
// @AfterThrowing//异常通知
// @AfterReturning//最终通知
@Around("pt()")//环绕通知
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("开始时间:"+new Date());
Object[] args= pjp.getArgs();
Object ret = pjp.proceed(args);//执行目标方法
//如果有@PrintTime注解 打印注解的title属性值
Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method != null) {
PrintTime methodAnnotation = method.getAnnotation(PrintTime.class);
if (methodAnnotation != null) {
System.out.println(methodAnnotation.title());
}
}
System.out.println("结束时间:"+new Date());
return ret;
}
}
3,只对带有@PrintTime注解的方法进行通知的方法:
//切点
//@Pointcut("execution(public * com.tianji.aopdemo.service..*.*(..))")
//private void pt(){}
//切点
@Pointcut("@annotation(com.tianji.aopdemo.config.PrintTime)") //注解的目录
private void pt() {}
4,还可以直接写成:(把通知和切入点结合)
@Around("@annotation(printTime)")
public Object around(ProceedingJoinPoint pjp,PrintTime printTime) throws Throwable {
System.out.println("开始时间:" + new Date());
Object[] args = pjp.getArgs();
Object ret = pjp.proceed(args);//执行目标方法
System.out.println(printTime.title());//打印注解的title属性
System.out.println("结束时间:" + new Date());
return ret;
}