借助Aop切面实现日志功能并保存数据库

使用Aop步骤如下:
1.增强方法

1. 日志信息获取
	 2. 日志信息添加至数据库

2.增强类型

后置增强
	ps: 我这里使用的后置增强,当然你也可以使用前置增强或者环绕增强

3.切入点

切注解
	ps:当然你也可以用来切方法

实现步骤:

  1. 定义日志实体类
  2. 定义dao方法
  3. 实现mapper.yml
  4. 定义service方法
  5. 实现service方法
  6. 实现controller接口

重头戏来了!

  1. 在自己的包里创建一个aop的包和annotation的包,在包里创建一个类如下↓
    ps:
  • aop包:用来写切面类
  • annotation:用来写在方法上的返回信息
  1. 在自己切面类里写入切面注解,然后把mapper层方法注入进来以及要用到的方法如下↓
    @Aspect 作用是把当前类标识为一个切面供容器读取
    @Component 类交给Spring管理
    需要写一个切入点 ,我这边切的就是刚刚写的那个annotation包下的那个类如下↓
    ps:
  2. 这里说一下annotation类里写的是一些返回给数据库的信息,也就是要定义在serviceImpl类上面的如下↓
  3. 接着就需要编写aop里的代码以及逻辑了 这里我写的注释还是比较清晰的 如下↓
public void CrudCommandAfter(JoinPoint joinPoint){//joinPoint获取目标方法的所有信息
		//导入hutool工具类jar包 cn.hutool.core.lang.ObjectId;
        String next = ObjectId.next();
        /**
         *1.获取日志信息
         */
        CrudCommand  crudCommand =new CrudCommand();
        //日志
        crudCommand.setCrudCommandIpcExpiredDate(new Date());
        //ip 通过工具类
        String byRequest = IPKit.getIpAddrByRequest(request);
        System.err.println(byRequest);
        //日志打印
        crudCommand.setCrudCommandIpcEndpoint(byRequest);

        //session用户名
        CrudCommand admin = (CrudCommand)request.getSession().getAttribute("admin");
        if(admin != null){
            crudCommand.setCrudCommandIpcId(admin.getCrudCommandIpcId());
        }else{
            crudCommand.setCrudCommandIpcId(next);
        }


        /**
         * 操作内容和接收格式'
         * 获取目标方法上的注解 连接点对象
         */

        //1.获取方法签名
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //2.通过方法签名获取方法对象
        Method method = signature.getMethod();
        //3.通过方法对象  获取方法对象注解
        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
        //获取值
        String type = annotation.type();
        crudCommand.setCrudCommandIpcAction(type);
        crudCommand.setCrudCommandIpcResponse(annotation.response());
        crudCommand.setCrudCommandIpcState(annotation.state());

        /**
         * 2.日志信息保存到数据库
         *   调用mapper添加方法
         */
       /* System.err.println("==================crudCommand"+crudCommand);*/
        commandMapper.append(crudCommand);
        /*System.err.println("测试后置增强。");*/

    }

5.接下来就需要往service加切面的注解了 以为我在annotation类里写了一些默认值 所以在service使用注解使也是可以不给某些参数赋值的 当然这个注解也是可以添加在Controller层的 但是不建议 如下↓

OpenTelemetry Collector 将 OTLP 日志转发到 clickhouse 并通过 grafana展示_spring


6.最终结果如下↓

OpenTelemetry Collector 将 OTLP 日志转发到 clickhouse 并通过 grafana展示_mysql_02

ps:我是用SpringBoot框架来做的。