Програмування з орієнтацією на аспекти в Java Spring Boot — Урок 01: Посібник для початківців з передових концепцій Spring Boot

Вступ
Аспектно-орієнтоване програмування (AOP) — це корисна техніка в розробці програмного забезпечення, яка допомагає розробникам відокремити загальні функціональності від основної логіки додатку. Це робить код чистішим та легшим для підтримки. У Spring Boot AOP легко використовувати, і він надає потужні інструменти для покращення структури вашого додатку. Хоча ви, можливо, не використовуєте AOP безпосередньо в кожному проекті Spring Boot, саме AOP є основою таких функцій, як кешування та управління транзакціями. Наприклад, коли ви використовуєте анотації, такі як @Transactional або @Cacheable, AOP працює в фоновому режимі, перехоплюючи виклики методів та застосовуючи необхідну поведінку. Розуміння основ AOP допоможе вам ефективніше використовувати ці функції.

У цій статті ми заглибимося в основи AOP, його переваги та те, як почати працювати з ним у Java Spring Boot.

Що таке аспектно-орієнтоване програмування (AOP)?

AOP — це парадигма програмування, яка доповнює об'єктно-орієнтоване програмування, вирішуючи проблеми, які стосуються кількох компонентів, такі як логування, безпека, управління транзакціями та моніторинг продуктивності. Замість того, щоб дублювати ці проблеми в кількох класах, AOP дозволяє інкапсулювати їх у багаторазові компоненти, які називаються аспектами.

Але чому ж нам потрібен AOP?

Уявіть, що у вас є кілька сервісних класів, і вам потрібно логувати кожен виклик методу для відлагодження. Без AOP вам доведеться вручну додавати код для логування в кожен метод кожного класу. Такий підхід може призвести до дублювання коду, і якщо логіка логування зміниться, вам потрібно буде оновити її в кількох місцях.

Зазвичай додаток на Spring Boot ділиться на три шари:

  1. Веб-шар для відкриття сервісів за допомогою RESTful веб-сервісів.
  2. Бізнес-шар для обробки бізнес-логіки.
  3. Шар даних для логіки збереження даних.

Кожен шар має свою відповідальність, і є деякі загальні аспекти, які застосовуються до всіх шарів, наприклад, логування, безпека, валідація тощо. Загальні аспекти також називають перехресними стурбованостями (cross-cutting concerns).

З AOP ви можете централізувати ці логіки в одному місці та автоматично застосовувати їх до всіх необхідних методів.

Без AOP:

@Service  
public class OrderService {  
 public void createOrder() {  
 System.out.println("Метод викликано: createOrder");  
 System.out.println("Створення замовлення...");  
 }  
}  

@Service  
public class PaymentService {  
 public void processPayment() {  
 System.out.println("Метод викликано: processPayment");  
 System.out.println("Обробка платежу...");  
 }  
}

З AOP:

@Aspect  
@Component  
public class LoggingAspect {  

 @Before("execution(* com.example.*.*(..))")  
 public void logBeforeMethodExecution(JoinPoint joinPoint) {  
 System.out.println("Метод викликано: " + joinPoint.getSignature().getName());  
 }  
}  

@Service  
public class OrderService {  
 public void createOrder() {  
 System.out.println("Створення замовлення...");  
 }  
}  

@Service  
public class PaymentService {  
 public void processPayment() {  
 System.out.println("Обробка платежу...");  
 }  
}

У цьому випадку LoggingAspect автоматично реєструє виклики методів, і вам не потрібно додавати код для логування в кожен метод вручну.

Основні терміни AOP:

  1. Аспект: Модульне вирішення проблеми, яка охоплює кілька класів. Клас LoggingAspect є прикладом аспекту. Він містить логіку для перехресних стурбованостей (логування).
  2. Join Point (Точка приєднання): Точка в коді, де можна застосувати аспект. Наприклад, коли викликається метод createOrder або processPayment.
  3. Advice (Рекомендація): Дія, яку виконуватиме аспект у певній точці приєднання. Вона визначає, що саме робить аспект. Існують такі типи: Before (до), After (після) та Around (округлення). Ось приклад рекомендації Before:
@Before("execution(* com.example.*.*(..))")  
public void logBeforeMethodExecution(JoinPoint joinPoint) {  
 System.out.println("Метод викликано: " + joinPoint.getSignature().getName());  
}

**Pointcut (Точка приєднання)**: Вираз `execution(* com.example.*.*(..))` є точкою приєднання. Він вказує, що рекомендація (advice) має застосовуватись до всіх методів в класах пакету `com.example`.

**5. Weaving (Плетіння)**: Плетіння — це процес застосування аспекту до цільових об'єктів. У Spring це відбувається автоматично під час виконання програми.

**Налаштування AOP у Spring Boot**

1. **Додайте залежності:** Додайте наступну залежність до файлу `pom.xml`:

org.springframework.boot
spring-boot-starter-aop


2. **Увімкніть AOP у вашому додатку:** Анотуйте клас вашого додатку Spring Boot анотацією `@EnableAspectJAutoProxy`:

@SpringBootApplication
@EnableAspectJAutoProxy
public class AopApplication {
public static void main(String[] args) {
SpringApplication.run(AopApplication.class, args);
}
}
```

  1. Створіть аспект: Ось приклад аспекту для логування:
@Aspect  
@Component  
public class LoggingAspect {  

 @Before("execution(* com.example.service.*.*(..))")  
 public void logBeforeMethodExecution(JoinPoint joinPoint) {  
 System.out.println("Метод викликано: " + joinPoint.getSignature().getName());  
 }  

 @After("execution(* com.example.service.*.*(..))")  
 public void logAfterMethodExecution(JoinPoint joinPoint) {  
 System.out.println("Метод виконано: " + joinPoint.getSignature().getName());  
 }  
}
  1. Створіть сервіс для тестування AOP: Створіть простий клас сервісу:
@Service  
public class ExampleService {  

 public void performTask() {  
 System.out.println("Виконання завдання...");  
 }  
}

Поради для написання ефективних аспектів

  • Використовуйте специфічні точки приєднання (pointcuts), щоб уникнути небажаних побічних ефектів.
  • Ретельно тестуйте аспекти, щоб переконатися, що вони працюють, як очікується.
  • Залишайте аспекти зосередженими на одній перехресній стурбованості.

Розширені можливості AOP для дослідження

  • Around Advice (Рекомендація Around): Отримуйте повний контроль над виконанням методу, включаючи можливість змінювати аргументи та значення, що повертаються.
  • Користувацькі анотації: Створюйте та використовуйте власні анотації для більш інтуїтивних точок приєднання.
  • Комбінація з Spring Security: Використовуйте AOP для розширених функцій безпеки, таких як контроль доступу на рівні методів.

Висновок
Аспектно-орієнтоване програмування (AOP) — це зміна гри для сучасної розробки програмного забезпечення. Інтегруючи AOP з Spring Boot, ви можете спростити складні додатки, покращити якість коду та зосередитись на бізнес-логіці. Цей урок знайомить вас з основними концепціями, залишайтеся з нами для Уроку 02, де ми розглянемо розширені приклади використання AOP та найкращі практики.

Ресурс для подальшого навчання:

Офіційна документація: https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/aop.html

Посилання:

  1. https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/aop.html
  2. https://medium.com/@toimrank/spring-boot-aop-with-example-a2757e389d0b

Перекладено з: Aspect-Oriented Programming in Java Spring Boot — Lesson 01: A Beginner’s Guide to Advanced Concepts of Spring Boot

Leave a Reply

Your email address will not be published. Required fields are marked *