`

springBoot Annotation 入参返回值日志打印

    博客分类:
  • java
阅读更多

 

一、定义注解

package com.yare.annotation;
import java.lang.annotation.*;
/**
 * @author : zhangyan 2018/9/19
 * 日志注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Inherited
@Documented
public @interface Log {

    String logStr() default "";
}

 

2.定义切面,实现环绕通知

package com.yare.annotation;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yare.exception.BusinessException;
import com.yare.exception.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author : zhangyan 2018/9/19
 */
@Component
@Aspect
@Slf4j
public class LogAspect {

    private final ObjectMapper mapper;
@Autowired
public LogAspect(ObjectMapper mapper) {
        this.mapper = mapper;
}

    @Pointcut(value = "execution(public * com.yare.controller.*.*(..))")
    public void recordLog() {
    }

    @Pointcut("@annotation(com.yare.annotation.Log)")
    private void cut() {
    }

    /**
     * 定制一个环绕通知
*
     * @param joinPoint
*/
@Around("cut()")
    public Object advice(ProceedingJoinPoint joinPoint) {
        try {
            StringBuffer param = new StringBuffer();
            for (Object object : joinPoint.getArgs()) {
                if (
                        object instanceof MultipartFile
                                || object instanceof HttpServletRequest
                                || object instanceof HttpServletResponse) {
                    continue;
}
                param.append(mapper.writeValueAsString(object))
                .append(",");
}
            log.info(joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName()
                    + ":parameter: " + param.toString() );
            final Object proceed = joinPoint.proceed();
log.info("RETURN"+proceed);
            return proceed;
} catch (Throwable e) {
            return new BusinessException(ResultCode.FAULT);
}
    }

    @Before("cut()")
    public void before() {
        log.info("已经记录下操作日志@Before 方法执行前");
}

    @After(value = "recordLog()")
    public void after() {
        log.info("已经记录下操作日志@After 方法执行后");
}

}

 

3. 在controller或者service的方法上就可以使用@Log标签了。

分享到:
评论

相关推荐

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...

    springboot 脱敏自定义注解

    在Spring中,AOP主要用于日志记录、性能监控、事务管理等方面。我们可以定义一个切面,包含一系列关注点,当这些关注点与业务代码(即切点)匹配时,切面的逻辑将被插入到切点中执行。 在本例中,"springboot 脱敏...

    aopDemo:springboot + aopAround日志记录+自定义注释解@ReqLog

    在`@Around`方法内部,开发者通常会先进行日志记录,然后调用`proceed()`方法执行目标方法,最后可能还会记录一些额外的日志信息,如方法的返回值或异常情况。这样,整个日志记录的过程就被封装在了AOP通知中,使得...

    22. Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    1. `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`:这个方法在目标处理器执行之前调用,返回值为布尔类型。如果返回`true`,则表示请求将继续处理;如果返回`false`,则...

    使用SpringBoot+AOP实现可插拔式日志的示例代码

    使用 SpringBoot+AOP 实现可插拔式日志的示例代码 本文主要介绍了使用 SpringBoot 与 AOP 实现可插拔式日志的示例代码,通过示例代码详细介绍了使用 AOP 实现可插拔式日志的步骤和实现方式。 首先,AOP(Aspect-...

    Spring AOP + AspectJ annotation example

    // 返回值日志记录代码 System.out.println("After returning from method: " + joinPoint.getSignature().getName()); } } ``` 在这个例子中,`LoggingAspect`类被标记为一个切面,`logBefore`和`...

    springboot_笔记

    - 随着JDK 1.5的推出,Spring 2.x开始支持注解(Annotation)。这使得开发者可以直接在Java类中定义和管理bean,显著减少了XML配置文件的使用,提高了开发效率。同时,也促进了代码与配置的紧密集成,使得项目结构...

    springboot使用xxl-job(注册执行器)

    选择执行器、填入 Job Handler 名称(与你定义的 `getHandler()` 方法返回值一致),并设置执行周期等参数。还可以通过 OpenFeign 调用接口来动态添加或修改定时任务,这需要在你的 Spring Boot 项目中配置 ...

    Aspect自定义springboot的使用.docx

    在Spring Boot中,面向切面编程(AOP)是一种强大的设计模式,它允许程序员定义横切关注点,如日志、事务管理等,这些关注点会在应用程序的多个点自动执行。以下将详细介绍如何自定义Spring Boot的AOP以及相关概念。 ...

    springboot-aop

    // 执行前置操作,如打印日志 System.out.println("方法执行前的操作"); } } ``` 2. 后置通知(After Advice): 后置通知在目标方法执行完成后,无论是否抛出异常都会被执行。它可以用于执行清理工作。`@After`...

    springboot-aop-aspect:Springboot使用Aspect实现一个切面,以记录日志为例

    在实际应用中,日志记录切面可能需要记录更多信息,比如方法名、参数、返回值等。这可以通过`JoinPoint`对象来获取,例如: ```java @Before("controllerMethods()") public void logBefore(JoinPoint joinPoint) {...

    springboot 使用自定义的aspect的示例代码

    在Spring Boot中,AOP(面向切面编程)是一种强大的工具,它允许程序员在不修改原有代码的情况下,向应用程序添加额外的功能,例如日志记录、事务管理、性能监控等。本篇文章将详细介绍如何在Spring Boot中自定义一...

    spring-boot添加 拦截器

    在Web开发中,拦截器常被用于实现如登录验证、权限控制、日志记录等功能。本篇文章将详细探讨如何在Spring Boot中添加和使用拦截器来实现登录拦截。 首先,我们需要了解Spring Boot中的拦截器是如何工作的。在...

    Spring Boot配置拦截器及实现跨域访问的方法

    如果返回值为true,表示继续流程(如调用下一个拦截器或处理器),如果返回值为false,则请求结束,不会继续向下执行。 - `postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ...

    java注解源码-Spring-Configuration-using-Annotation-and-Java-Source-Code:Spr

    本项目“Spring-Configuration-using-Annotation-and-Java-Source-Code”深入探讨了如何使用Java注解来构建Spring应用的配置。以下是关于Java注解和Spring框架在配置中的应用的详细知识点: 1. **Java注解**: - ...

    spring 4.3.4 jar

    2. **注解驱动开发(Annotation-based Development)**:Spring 4.3.4加强了对Java注解的支持,如`@Component`、`@Service`、`@Repository`和`@Controller`,用于声明组件、服务、存储库和控制器类。此外,`@...

    spring-demo-annotations

    在Java编程中,注解(Annotation)是一种元数据,它提供了将信息附加到代码而不改变其行为的方式。Spring框架充分利用了Java注解,使得开发者可以避免XML配置,提高代码的可读性和可维护性。 1. **依赖注入...

Global site tag (gtag.js) - Google Analytics