spring-boot利用AOP实现全局日志与异常处理

2 下载量 62 浏览量 更新于2024-09-03 收藏 116KB PDF 举报
"在Spring Boot应用中,利用AOP(面向切面编程)实现统一的日志管理和异常处理是一种常见的实践。本文将详细介绍如何在Spring Boot 1.4.1版本的环境中,结合Java 1.8,利用`spring-boot-starter-aop`依赖来集成AOP并创建自定义日志规则。首先,需要在`pom.xml`中添加`spring-boot-starter-aop`和`gson`库以支持AOP和数据序列化。 在启动类`DemoApplication`中,添加了两个简单的RESTful API接口。一个无参GET请求`/testAspect`,用于测试基础操作;另一个带参数的GET请求`/testAspect?name=XXX&age=XXX`,旨在演示如何通过AOP捕获参数并记录。在这些方法上,我们可以定义一个切面(aspect),比如`@Around`注解的方法,该方法会在目标方法执行前后进行特定的操作,如日志记录、性能分析或异常处理。 具体实现步骤如下: 1. 添加AOP依赖:在`pom.xml`中加入`<dependency>`标签,引入`spring-boot-starter-aop`和Gson库,以便于日志信息的格式化和打印。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.7</version> </dependency> ``` 2. 创建切面:在Spring Boot应用中,可以编写一个切面类,定义一个`@Around`注解的方法,例如`@Around("@annotation(loggable)")`,其中`loggable`是自定义的注解,用于标记需要被拦截的方法。在`@Around`方法中,可以使用`proceed()`调用目标方法,并在前后添加日志记录。 ```java @Aspect @Component public class LoggingAspect { @Around("@annotation(loggable)") public Object logAndHandle(ProceedingJoinPoint joinPoint, Loggable loggable) throws Throwable { // 开始记录日志 long start = System.currentTimeMillis(); String methodName = joinPoint.getSignature().getName(); try { // 执行目标方法 Object result = joinPoint.proceed(); // 结束记录日志并打印 long duration = System.currentTimeMillis() - start; logInfo(methodName, loggable.getMessage(), result, duration); return result; } catch (Exception e) { // 异常处理 logError(methodName, loggable.getMessage(), e); throw e; } } // 日志记录方法 private void logInfo(String methodName, String message, Object result, long duration) { // 使用Gson将对象转换为JSON字符串 Gson gson = new Gson(); String jsonResult = gson.toJson(result); // 打印日志 // ... } private void logError(String methodName, String message, Exception e) { // 记录错误日志 // ... } } ``` 3. 使用切面:在需要统一处理的日志方法上添加`@Loggable`注解,传入相关信息,如日志级别、消息模板等。这样,当这些方法被调用时,AOP会自动执行切面中的逻辑。 ```java public class UserController { @RequestMapping("/testAspect") @Loggable(level = LogLevel.INFO, message = "处理用户请求: {user}") public UserVo testUser(UserVo userVo) { // 方法体... } // 其他方法... } ``` 通过这种方式,Spring Boot应用中的所有符合`@Loggable`注解的方法都会按照统一的策略进行日志记录和异常处理,提高了代码的可维护性和灵活性。这在处理大量业务逻辑的项目中尤其有用,可以减少重复的代码和分散的日志处理逻辑。