SpringBoot配置AOP注解式环绕输出日志

tech2025-09-01  5

SpringBoot配置AOP注解式环绕输出日志

一:添加依赖

创建好一个SpringBoot项目之后,添加aop依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>

二:编写切面

在切面中确定要使用aop环绕通知的类或方法,以及aop执行的动作,此处是环绕打印日志。

package com.demo.hospital.minses.config.aop; import com.fasterxml.jackson.databind.ObjectMapper; import com.demo.agilegson.AGSON; import com.demo.hospital.minses.common.component.BizException; import com.demo.hospital.minses.common.component.ErrorCode; import com.demo.phobos.exception.ServiceError; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.lang.reflect.Method; /** * 日志aop * 记录对外,依赖服务的请求数据 */ @Component @Aspect public class LogAspect { private static final Logger log = LoggerFactory.getLogger(LogAspect.class); ObjectMapper mapper = new ObjectMapper(); /** * 外部接口调用的日志监控 * @param joinPoint * @return * @throws Throwable */ @Around(value = "execution(* com.ellis.demo.minses.biz.service.biz.impl..*.* (..))") public Object doRequestAround(ProceedingJoinPoint joinPoint) throws Throwable { try{ Object result; MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); String name = method.getName(); Object[] args = joinPoint.getArgs(); Object object = joinPoint.getTarget(); log.info("class :{} , method :{}, param :{}", object.getClass().getName(),name, mapper.writeValueAsString(args)); result = joinPoint.proceed(); log.info("class :{} , method :{}, result :{}", object.getClass().getName(),name, genResultString(result)); return result; }catch (Exception e){ log.error("Error :" , e); if(!(e instanceof ServiceError)){ throw new BizException(ErrorCode.BIZ_ERROR.getMessage()); }else{ throw e; } } } /** * 如果返回值字段超过了1024,则截取 * @param result * @return */ private String genResultString(Object result){ //如果结果为空,只直接返回 if(result == null){ return null; } String val = AGSON.toJSONString(result); if(val.length() > 1024){ return val.substring(0,1023); } return val; } }

注解Around: 切入点表达式execution语法:

1:execution(): 表达式主体。 2:第一个星号:表示返回类型,星号表示所有的类型。 3:包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,子孙包下所有类的方法。 4:第二个星号:表示类名,星号表示所有的类。 5:*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

AOP的其他用法

此外:除了环绕通知外,还有前置通知后置通知等多种aop用法,下面简单罗列一下

@Aspect:作用是把当前类标识为一个切面供容器读取 @Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。 @Around:环绕增强,相当于MethodInterceptor @AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行 @Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有 @AfterThrowing:异常抛出增强,相当于ThrowsAdvice @After: final增强,不管是抛出异常或者正常退出都会执行
最新回复(0)