Практическое использование AOP для логирования
Логирование является одной из самых распространённых задач, где применяют AOP. Вместо того чтобы добавлять логи в каждый метод вручную, можно создать аспект, который автоматически будет логировать информацию о вызовах методов, их параметрах, результатах и времени выполнения.
1. Задача: Логирование вызовов методов
Cоздадим аспект, который будет:
Логировать вызовы методов сервисного слоя.
Выводить информацию о параметрах методов.
Логировать результат выполнения.
Замерять время выполнения метода.
Шаг 1: Зависимости
Добавьте в pom.xml зависимости для работы с AOP:
Шаг 2: Создание аспекта логирования
Шаг 3: Бизнес-логика
Создадим простой сервис для тестирования:
Шаг 4: Проверка
Теперь вызов методов UserService будет автоматически логироваться:
Пример лога:
#Java #Training #Spring #AOP #AOP_for_logging
Логирование является одной из самых распространённых задач, где применяют AOP. Вместо того чтобы добавлять логи в каждый метод вручную, можно создать аспект, который автоматически будет логировать информацию о вызовах методов, их параметрах, результатах и времени выполнения.
1. Задача: Логирование вызовов методов
Cоздадим аспект, который будет:
Логировать вызовы методов сервисного слоя.
Выводить информацию о параметрах методов.
Логировать результат выполнения.
Замерять время выполнения метода.
Шаг 1: Зависимости
Добавьте в pom.xml зависимости для работы с AOP:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Шаг 2: Создание аспекта логирования
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Aspect
@Component
public class LoggingAspect {
// Логируем все методы в сервисном слое
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
System.out.println("Method called: " + joinPoint.getSignature());
System.out.println("Arguments: " + Arrays.toString(joinPoint.getArgs()));
Object result;
try {
result = joinPoint.proceed(); // Выполняем метод
System.out.println("Method result: " + result);
} catch (Throwable ex) {
System.out.println("Method threw an exception: " + ex.getMessage());
throw ex;
}
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Method execution time: " + elapsedTime + " ms");
return result;
}
}
Шаг 3: Бизнес-логика
Создадим простой сервис для тестирования:
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUserById(Long id) {
System.out.println("Fetching user from database...");
return "User" + id;
}
public void updateUser(Long id, String name) {
System.out.println("Updating user in database...");
}
}
Шаг 4: Проверка
Теперь вызов методов UserService будет автоматически логироваться:
@RestController
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@PutMapping("/users/{id}")
public void updateUser(@PathVariable Long id, @RequestBody String name) {
userService.updateUser(id, name);
}
}
Пример лога:
Method called: String com.example.service.UserService.getUserById(Long)
Arguments: [1]
Fetching user from database...
Method result: User1
Method execution time: 5 ms
#Java #Training #Spring #AOP #AOP_for_logging