AOP自定义注解保存到MongoDB数据库

如果你想用mongoDB做全局日志记录,比如记录controller方法执行相关数据,比如像这样。

AOP自定义注解保存到MongoDB数据库_第1张图片

整个流程:先写自定义注解。定义一个日志对象,字段属性设置好。 写aop 规范自定义注解如何使用,在其中通过切点和反射把相关参数存到日志对象,然后再用MongoTemplate的自带方法,保存到MongoDB数据库。

1.下载安装mongodb、设置全局变量、开机自启动.

1.1 参考这篇,写得非常详细了。

MongoDB的安装配置教程(很详细,你想要的都在这里)【我直接把图像软件Compass一并下载安装了,方便查看数据】

2.SpringBoot整合MongoDB,可参考这篇。

SpringBoot整合MongoDB

2.1 导入依赖

 
        org.springframework.boot
        spring-boot-starter-data-mongodb

2.2 yml文件配置

spring:
  data:
    mongodb:
      host: 127.0.0.1 #指定MongoDB服务地址
      port: 27017 #指定端口,默认就为27017
      database: systemLog #指定使用的数据库(集合)
      authentication-database: admin # 登录认证的逻辑库名
#     username: admin #用户名
#     password: abc123456 #密码

2.3 创建日志实体类(你想保存哪些信息)

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "systemLogger")
public class SystemLogger {

    //用户名
    private String username;
    //TODO 请求方式
    private String requestMethod;
    //controller方法
    private String controllerLink;
    //模块名称(写在注解上的value)
    private String mode;
    //TODO 请求人ip地址
    private String ip;
    //操作时间
//    @JSONField(format = "yyyy-MM-dd mm:HH:ss")
    private String operationTime;
    //耗时
    private Long time;
}

2.4 创建自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)

public @interface SystemLog {
    String value() default "";//当前模块描述
    String requestMethod()default "";//请求方法
}

2.5 创建 aop 写自定义注解执行逻辑 

aop:面向切面编程。将于业务无关,却对多个对象产生影响的的公共行为和逻辑。常用来保存系统日志。

package com.woniu.sys.aop; //根据你的包来
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.woniu.sys.mapper.UserMapper;
import com.woniu.sys.pojo.SystemLogger;
import com.woniu.sys.annotation.SystemLog;
import com.woniu.sys.pojo.User;//根据你的包来
import com.woniu.sys.utils.Application;//这个是我的工具类,解析请求里的token拿userId的
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

@Aspect
@Component

public class SystemLogAOP {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private UserMapper userMapper;

    //切点表达式 拿执行方法的相关参数
    @Around("@annotation(com.woniu.sys.annotation.SystemLog)")
    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {

        //拿方法上的注解
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        SystemLog annotation = method.getAnnotation(SystemLog.class);
        //注解上的value
        String mode = annotation.value();

        //当前操作时间
        long startTime = System.currentTimeMillis();
        Date date = new Date(startTime);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String operationTime = simpleDateFormat.format(date);
        //执行方法
        Object proceed = joinPoint.proceed();
        //结束时间
        long endTime = System.currentTimeMillis();

        //耗时
        long time = endTime - startTime;
        
        //当前操作人用户名
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
        queryWrapper.eq(User::getId, Application.getUserId());
        User user = userMapper.selectOne(queryWrapper);
        
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        // 获取控制器路径
        String path = request.getRequestURI();

        // 获取控制器方法的请求方式
        String requestMethod = annotation.requestMethod();

        //请求人Ip
        String ip = request.getRemoteAddr();
        //组装日志对象
        SystemLogger systemLogger = SystemLogger.builder().ip(ip).username(user.getUsername()).time(time).operationTime(operationTime).mode(mode).controllerLink(path).requestMethod(requestMethod).build();

        //持久化保存
        mongoTemplate.save(systemLogger);
        return proceed;
    }





}

 

2.6 把注解贴在需要的方法上

我这里是贴在controller里的某个方法上。

 //找所有角色分类
    @SystemLog(value = "找所有角色分类",requestMethod = "Get")
    @GetMapping("/roleType")
    public ResData getRoleType(){
        LambdaQueryWrapper queryWrapper2 = new LambdaQueryWrapper();
        List allRoleList = roleMapper.selectList(queryWrapper2);
        return ResData.ok(allRoleList);
    }

2.7 apifox 测试

AOP自定义注解保存到MongoDB数据库_第2张图片

 2.8 MongoDB里查看document数据

AOP自定义注解保存到MongoDB数据库_第3张图片

 

如果不会用apifox,可以看这篇 Apifox快速扫盲。

你可能感兴趣的:(java,开发语言)