一、定义注解
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标签了。
相关推荐
在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...
在Spring中,AOP主要用于日志记录、性能监控、事务管理等方面。我们可以定义一个切面,包含一系列关注点,当这些关注点与业务代码(即切点)匹配时,切面的逻辑将被插入到切点中执行。 在本例中,"springboot 脱敏...
在`@Around`方法内部,开发者通常会先进行日志记录,然后调用`proceed()`方法执行目标方法,最后可能还会记录一些额外的日志信息,如方法的返回值或异常情况。这样,整个日志记录的过程就被封装在了AOP通知中,使得...
1. `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`:这个方法在目标处理器执行之前调用,返回值为布尔类型。如果返回`true`,则表示请求将继续处理;如果返回`false`,则...
使用 SpringBoot+AOP 实现可插拔式日志的示例代码 本文主要介绍了使用 SpringBoot 与 AOP 实现可插拔式日志的示例代码,通过示例代码详细介绍了使用 AOP 实现可插拔式日志的步骤和实现方式。 首先,AOP(Aspect-...
// 返回值日志记录代码 System.out.println("After returning from method: " + joinPoint.getSignature().getName()); } } ``` 在这个例子中,`LoggingAspect`类被标记为一个切面,`logBefore`和`...
- 随着JDK 1.5的推出,Spring 2.x开始支持注解(Annotation)。这使得开发者可以直接在Java类中定义和管理bean,显著减少了XML配置文件的使用,提高了开发效率。同时,也促进了代码与配置的紧密集成,使得项目结构...
选择执行器、填入 Job Handler 名称(与你定义的 `getHandler()` 方法返回值一致),并设置执行周期等参数。还可以通过 OpenFeign 调用接口来动态添加或修改定时任务,这需要在你的 Spring Boot 项目中配置 ...
在Spring Boot中,面向切面编程(AOP)是一种强大的设计模式,它允许程序员定义横切关注点,如日志、事务管理等,这些关注点会在应用程序的多个点自动执行。以下将详细介绍如何自定义Spring Boot的AOP以及相关概念。 ...
// 执行前置操作,如打印日志 System.out.println("方法执行前的操作"); } } ``` 2. 后置通知(After Advice): 后置通知在目标方法执行完成后,无论是否抛出异常都会被执行。它可以用于执行清理工作。`@After`...
在实际应用中,日志记录切面可能需要记录更多信息,比如方法名、参数、返回值等。这可以通过`JoinPoint`对象来获取,例如: ```java @Before("controllerMethods()") public void logBefore(JoinPoint joinPoint) {...
在Spring Boot中,AOP(面向切面编程)是一种强大的工具,它允许程序员在不修改原有代码的情况下,向应用程序添加额外的功能,例如日志记录、事务管理、性能监控等。本篇文章将详细介绍如何在Spring Boot中自定义一...
在Web开发中,拦截器常被用于实现如登录验证、权限控制、日志记录等功能。本篇文章将详细探讨如何在Spring Boot中添加和使用拦截器来实现登录拦截。 首先,我们需要了解Spring Boot中的拦截器是如何工作的。在...
如果返回值为true,表示继续流程(如调用下一个拦截器或处理器),如果返回值为false,则请求结束,不会继续向下执行。 - `postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ...
本项目“Spring-Configuration-using-Annotation-and-Java-Source-Code”深入探讨了如何使用Java注解来构建Spring应用的配置。以下是关于Java注解和Spring框架在配置中的应用的详细知识点: 1. **Java注解**: - ...
2. **注解驱动开发(Annotation-based Development)**:Spring 4.3.4加强了对Java注解的支持,如`@Component`、`@Service`、`@Repository`和`@Controller`,用于声明组件、服务、存储库和控制器类。此外,`@...
在Java编程中,注解(Annotation)是一种元数据,它提供了将信息附加到代码而不改变其行为的方式。Spring框架充分利用了Java注解,使得开发者可以避免XML配置,提高代码的可读性和可维护性。 1. **依赖注入...