Spring实现日志切面

AOP相关注解介绍

@Aspect:作用是把当前类标识为一个切面供容器读取
@Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
@Around:环绕增强,相当于MethodInterceptor
@AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
@Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
@AfterThrowing:异常抛出增强,相当于ThrowsAdvice
@After: final增强,不管是抛出异常或者正常退出都会执行

@Pointcut的用法

//表示匹配所有方法  
1)execution(* *(..))  
//表示匹配com.xl.server.UserService中所有的公有方法  
2)execution(public * com. xl.service.UserService.*(..))  
//表示匹配com.xl.server包及其子包下的所有方法
3)execution(* com.xl.server..*.*(..))  
//表示匹配注解SysLog
4)@annotation(com.platform.annotation.SysLog)

自定义注解

package com.hnac.hzinfo.logger.entity;

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)
public @interface MyLog {

    //日志标题
    public String title() default "";

}

日志切面

package com.hnac.hzinfo.logger.support;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.hnac.hzinfo.logger.annotation.Operate;
import com.hnac.hzinfo.logger.constant.BusinessStatusEnum;
import com.hnac.hzinfo.logger.entity.Operation;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Aspect
@Component
public class MyLogAspect {

    @Pointcut("@annotation(com.hnac.hzinfo.logger.entity.MyLog)")
    public void logPointCut(){

    }

    @AfterReturning(pointcut = "logPointCut()")
    public void doAfterReturning(JoinPoint point) throws JsonProcessingException {
        recordMyLog(point, null);
    }

    private void recordMyLog(final JoinPoint point, final Exception e) throws JsonProcessingException {
        System.out.println("自定义注解记录日志");
    }

    @AfterThrowing(value = "logPointCut()",throwing = "e")
    public void doAfterReturning(JoinPoint point,Exception e) throws JsonProcessingException {
        System.out.println("自定义注解记录日志-异常时进入");
    }
}

使用自定义注解

    @Override
    @MyLog(title = "自定义日志切面")
    public int addGate(IrrBDGate irrBDGate) {
        int i = 0;
        //判断闸门编码重复
        IrrBDGate juggeGate = irrBDGateMapper.selectByPrimaryKey(irrBDGate.getStrobeCode());
        if(juggeGate != null){
            throw new RuntimeException("存在重复的闸门编码为:"+irrBDGate.getStrobeCode()+"的数据");
        }
        i = irrBDGateMapper.insertSelective(irrBDGate);

        return i;
    }

 

日志切面参考了文章:https://www.cnblogs.com/lc0605/p/10675662.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨两点钟同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值