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;}