实现一下aop切面存储操作日志,并且解释每一行代码的意思
时间: 2024-02-24 20:54:12 浏览: 68
好的,下面是一个简单的示例,演示如何使用 AOP 实现切面存储操作日志:
```java
@Aspect
@Component
public class LogAspect {
private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Autowired
private HttpServletRequest request;
@Pointcut("execution(public * com.example.controller.*.*(..))")
public void controllerLog() {}
@Before("controllerLog()")
public void doBefore(JoinPoint joinPoint) {
logger.info("Request URL : {} {}", request.getRequestURL().toString(), request.getMethod());
logger.info("IP : {}", request.getRemoteAddr());
logger.info("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
logger.info("Args : {}", Arrays.toString(joinPoint.getArgs()));
}
@AfterReturning(returning = "result", pointcut = "controllerLog()")
public void doAfterReturning(Object result) {
logger.info("Response : {}", result);
}
}
```
代码解释:
- `@Aspect` 注解表示这是一个切面类。
- `@Component` 注解表示让 Spring 自动扫描并注册该组件。
- `private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);` 声明一个日志记录器。
- `@Autowired private HttpServletRequest request;` 注入 HttpServletRequest 对象,以便获取请求信息。
- `@Pointcut("execution(public * com.example.controller.*.*(..))")` 定义切点,表示匹配 com.example.controller 包下的所有公共方法。
- `@Before("controllerLog()")` 定义前置通知,表示在切点方法执行前执行该方法。
- `JoinPoint` 是 Spring AOP 提供的用于获取连接点信息的类,可以获取方法名、参数等信息。
- `@AfterReturning(returning = "result", pointcut = "controllerLog()")` 定义后置通知,表示在切点方法执行后执行该方法。
- `returning = "result"` 表示将方法的返回值赋值给 result 参数。
- `logger.info()` 是日志记录器的方法,用于记录日志信息。
以上代码实现了一个简单的 AOP 切面,用于记录 controller 的操作日志。在具体的业务场景中,可以根据实际需要进行扩展和定制。
阅读全文