首页 > 其他分享 >定义自己的注解,用aop完成日志操作

定义自己的注解,用aop完成日志操作

时间:2025-01-06 10:58:27浏览次数:3  
标签:String joinPoint operLog 获取 aop 注解 日志 annotation

1.引入依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>${spring.version}</version>
</dependency>

2. 定义注解类

//表示该注解使用的位置 TYPE:类,接口 FIELD:属性 METHOD:方法 PARAMETER:参数
@Target({ElementType.METHOD,ElementType.TYPE})
//该注解使用后什么时候生效。源码 SOURCE源码时---编译后后CLASS----运行时RUNTIME 默认是SOURCE 一般使用RUNTIME
@Retention(RetentionPolicy.RUNTIME)
@Documented  //在生成API文档时是否存在该注解
public @interface MyAnnotation {
    String name();
}

 3.定义切面类

@Component @Aspect标记该类为切面类

                1.定义切点 

         @Pointcut("@annotation(com.fourth.annotation.MyAnnotation)")

                2.处理        通知类型

@Component//表示该类交于spring容器管理
@Aspect//表示该类为切面类
public class LogAspectj {
    /*2.定义切点.
    第一个*:表示返回类型,
    第二个*:表示所有类
    第三个*: 表示所有的方法
    ..:表示任意参数
     @Pointcut("execution(* com.fourth.controller.EmpController.login(..))||execution(* com.fourth.controller.DeptController.list(..))")  //execution使用路径方式
     public void pointcut(){}*/
    @Pointcut("@annotation(com.fourth.annotation.MyAnnotation)")
    public void pointcut(){}

    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpSession session;
    @Autowired
    private OperLogMapper operLogMapper;

    //环绕通知
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint){
        //操作日志的对象
        OperLog operLog=new OperLog();
        //获取业务类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //获取被代理的方法对象
        Method method = signature.getMethod();
        //获取被代理方法对象上的注解对象
        MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
        //获取注解上name属性的值
        String name = annotation.name();
        operLog.setBusinesstype(name);
        //2.获取被代理的接口方法名
        String method1 = joinPoint.getSignature().getName();
        operLog.setMethod(method1);
        //3.获取请求方式
        String method2 = request.getMethod();
        operLog.setRequestmethod(method2);
        //4.获取操作人的姓名
        Emp emp= (Emp) session.getAttribute("userinfo");
        operLog.setOpername(emp.getEmpName());
        //5.获取请求的地址
        String operUrl = request.getRequestURI();
        operLog.setOperurl(operUrl);
        //6.获取ip地址
        String remoteAddr = request.getRemoteAddr();
        operLog.setOperip(remoteAddr);
        //7. 获取被代理方法的参数
        Object[] args = joinPoint.getArgs();
        String s = Arrays.toString(args);
        operLog.setOperparam(s);
        //8.操作时间
        operLog.setOpertime(new Date());
        try{
            Object proceed = joinPoint.proceed(); 
            operLog.setJsonresult(proceed.toString());
            //9.设置状态
            operLog.setStatus(0);
            return proceed;
        }catch (Throwable throwable){
            //设置状态
            operLog.setStatus(1);
            throwable.printStackTrace();
        }finally {
            operLogMapper.insert(operLog);
        }
        return null;
    }







}

4.开启注解驱动

 <aop:aspectj-autoproxy/>

标签:String,joinPoint,operLog,获取,aop,注解,日志,annotation
From: https://blog.csdn.net/weixin_51635918/article/details/144957891

相关文章

  • springboot没加@ResponseBody注解导致的循环调用
    一、问题背景为了自定义后端返回异常,在代码中使用了全局异常处理器如下:@ControllerAdvicepublicclassGlobalExceptionHandler{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value=BusinessExcep......
  • Redis 服务器的日志文件
    这段日志是Redis服务器的日志文件,记录了Redis在运行过程中的一些事件和警告。下面是对日志中关键信息的分析:AsynchronousAOFfsyncistakingtoolong(diskisbusy?):这个警告表明Redis的异步AOF(AppendOnlyFile)持久化操作中的fsync调用花费了太长时间。这......
  • 关于 webservice 日志中 源IP是node IP的问题,是否能解决换成 真实的客户端IP呢
    本篇目录1.问题背景2.部署gitlab17.52.1添加repo源2.2添加repo源下载17.5.0的charts包2.3修改values文件2.3.1hosts修改如下2.3.2appConfig修改如下2.3.3gitlab下的sidekiq配置2.3.4certmanager修改如下2.3.5nginx-ingress修改如下2.3.6<可选>prometheus修......
  • Spring Boot注解大揭秘:掌握Spring Boot精髓
    首先,想象一下你正在搭建一个超级英雄团队,每个注解就像是团队里不同的角色,他们都有各自的任务。1.@SpringBootApplication:这是团队的队长,也就是“启动者”。当你把这个注解放在一个类上时,它就像是告诉SpringBoot:“嘿,从这里开始,准备启动我的超级英雄团队啦!”然后,它会去找到团......
  • Spring MVC注解故障追踪记15
    SpringMVC是美团点评很多团队使用的Web框架。在基于SpringMVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,如:@Controller、@Service、@Autowired等;同时还可能有自定义注解等。注解一方面可以作为标记说明使......
  • Log Parser Lizard 8.7:一款用于高级日志分析的动态图形界面工具,使用 SQL 查询多种结构
    LogParserLizard:AdvancedSQLAnalysisforLogFiles LogParserLizard version 8.7lizardlabs(LizardLabsSoftware)·GitHubLogParserLizard:一款用于高级日志分析的动态图形界面工具使用SQL查询多种结构化日志数据,包括服务器日志和Windows事件日志。体......
  • Spring AOP 面试题大全
    以下是SpringAOP(Aspect-OrientedProgramming,面向切面编程)面试中常见的15+道经典问题,每道问题都包含详细解答和代码示例,以便于理解与记忆。1.什么是AOP?问题:请解释什么是AOP以及其核心概念。解答:AOP是一种编程思想,用于处理程序中的横切关注点(如日志、事......
  • Spring MVC注解故障追踪记6
    SpringMVC是美团点评很多团队使用的Web框架。在基于SpringMVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,如:@Controller、@Service、@Autowired等;同时还可能有自定义注解等。注解一方面可以作为标记说明使......
  • Spring MVC注解故障追踪记5
    SpringMVC是美团点评很多团队使用的Web框架。在基于SpringMVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,如:@Controller、@Service、@Autowired等;同时还可能有自定义注解等。注解一方面可以作为标记说明使......
  • Spring MVC注解故障追踪记4
    SpringMVC是美团点评很多团队使用的Web框架。在基于SpringMVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,如:@Controller、@Service、@Autowired等;同时还可能有自定义注解等。注解一方面可以作为标记说明使......