- 简介
- 一:自定义注解
- 二:自定义AOP切面
- 三:实际运用
写这篇博客,是自己在第二次使用到自定义注解及切面来实现日志的记录,项目的框架是在SpringMvc。基础的aop包,依赖等等,都是已经具备好的,不做介绍。
一:自定义注解
使用@interface自定义自己的注解
可是在类里设置一些默认值。这是第一步,完成后我们可以再自己想要用的自己直接加上@Tablog就能使该注解生效。
二:自定义切面
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AspectTab {
@Pointcut("@annotation(cj.aop.TabLog)")
public void pointcut()
{ System.out.println("pointcut");}
@Around(value = "pointcut()")
public Object aroundRecordLog(ProceedingJoinPoint pjp) throws Throwable
{
System.out.println("around before");
//获取参数
Object [] objs=pjp.getArgs();
for(Object obj :objs)
{
System.out.println(obj);
}
//返回值
Object oo=pjp.proceed();
System.out.println("around after"+":"+oo);
Object object;
try {
object = pjp.proceed();
} catch (Exception e) {
throw e;
}
return object;
}
}
几个注意点
1:@Aspect注解不能丢(除非配置文件里配置,这样比较麻烦)
2:@Pointcut("@annotation(cj.aop.TabLog)")切点位置指向刚才定义的注解,这样在调用注解的时候,我们的切面才能生效。
3:@Around(value = "pointcut()")我这里用的是around,大家也可以用before,after,就是个执行顺序的问题,不细说。
4:参数传递,没有传参的调用总感觉是不完整的,日志记录更需要传参
//获取参数 Object [] objs=pjp.getArgs();
三:实际运用
普通注解运用一样,()里写进自己要传递的参数,若参数为空,则为自定义注解里的默认值。