Java for Beginner
675 subscribers
558 photos
156 videos
12 files
852 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Практическое использование AOP для логирования

Логирование является одной из самых распространённых задач, где применяют 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