AspectJ 代码实现(AOP实现)

定义注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default "";
}

日志切面实现(AOP实现)

  • 定义切面类-注解@Aspect
  • 定义切点-@pointcut(表明需要通过什么方式进行切 @execution() ||@annotation等 )
  • 切面通知-前置通知、后置通知、环绕通知(@After @Before @Around @AfterReturing @AfterThrowing
  • 连接点-JoinPoint 以及ProceedingJoinPoint(@Around 环绕通知需要通过该类来处理)类,记录了,切点方法的入参及类信息
@Component
@Aspect
public class LogAspect {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class);


    @Pointcut("@annotation(com.common.Log)")
    private void log(){}

    @Around("log()")
    public Object handler(ProceedingJoinPoint point) throws Throwable{
        Object object = new Object();
        StopWatch stopWatch = new StopWatch("logPrintStopWatch");
        String errorMsg = null;
        try {
            LOGGER.info("log print start");
            stopWatch.start();
            try{
                object = point.proceed();
            }catch (Throwable e){
                errorMsg = e.getMessage();
                stopWatch.stop();
                throw e;
            }
            stopWatch.stop();
            return object;
        }finally {
            Object[] args = point.getArgs();
            String clazz = point.getTarget().getClass().getName();
            String method = point.getSignature().getName();
            try{
               // 记录日志信息
               LOGGER.info("记录日志-参数:{},类名-{},方法-{}",args,clazz,method);
            }catch (Exception e){
                LOGGER.error("插入记录失败-{}",e.getMessage());
            }
            LOGGER.info("log print end");
        }
    }
}

该切面日志通过在方法里注解Log,可以实现日志的统一输出(也可以通过切某个目录下的类方法通过@execution()定义)

你可能感兴趣的:(java)