MS Lesson25: AOP
1. Cross cutting concern - tetbiqin bir cox yerinde lazim olan, amma esas biznes mentiqine aid olmayan funksionalliq. Mes: loggin, security, audit.
Sade misal: createOrder, pay, deleteUser - her biri ferqli biznes ishi gorur. Amma hamisinda eyni sheyler lazim ola biler. * log yazma, * icaze yoxlamaq, * vaxt olcmek, * tranzaksiya acmaq/baglamaq. Bunlar concern-dir (narahatliq/ehtiyac), biznesin ozu deyil.
Spring Boot application ucun dependency:
implementation 'org.springframework.boot:spring-boot-starter-aspectj'Log misali:
package az.etibarli.demoaop.step1.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class LoggingAspect {
@Before("execution(public * az.etibarli.demoaop.step1.service..*(..))")
public void logBefore(JoinPoint joinPoint) {
log.info("[BEFORE] metod: {} | args: {}",
joinPoint.getSignature().toShortString(),
joinPoint.getArgs());
}
@After("execution(public * az.etibarli.demoaop.step1.service..*(..))")
public void logAfter(JoinPoint joinPoint) {
log.info("[AFTER] metod: {}", joinPoint.getSignature().toShortString());
}
}
2. @AfterReturning - yalniz ugurlu cavab
audit / izleme - "sifarish yaradildi, odenish tamamlandi" kimi ugurlu emeliyyati jurnalda saxlamaq
metric / statistic - ugurlu API cagirishlarinin sayi
event - ugurlu odenishden sonra "payment completed" event gondermek
debug - return deyerini loglamaq
@AfterThrowing - yalniz exception
xeta loglama - butun servis xeetalarini eyni formatda yazmaq
alert / monitorig - kritik exception-da Slack/Telgram/Email notification gondermek
full metrika - error rate dashboard
tehlukesizlik auditi - ugursuz login, icazesiz cehd
kompensasiya / cleanup qeydi - "odenish ugursuz oldu" statusunu audit cedveline yazmaq
@After - her iki halda (finally kimi)
package az.etibarli.demoaop.step2.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ResultLoggingAspect {
private static final Logger log = LoggerFactory.getLogger(ResultLoggingAspect.class);
@Before("execution(public * az.etibarli.demoaop.step2.service..*(..))")
public void logBefore(JoinPoint joinPoint) {
log.info("[BEFORE] metod: {} | args: {}",
joinPoint.getSignature().toShortString(),
joinPoint.getArgs());
}
@AfterReturning(
pointcut = "execution(public * az.etibarli.demoaop.step2.service..*(..))",
returning = "result"
)
public void logAfterReturning(JoinPoint joinPoint, Object result) {
log.info("[AFTER-RETURNING] metod: {} | nəticə: {}",
joinPoint.getSignature().toShortString(),
result);
}
@AfterThrowing(
pointcut = "execution(public * az.etibarli.demoaop.step2.service..*(..))",
throwing = "ex"
)
public void logAfterThrowing(JoinPoint joinPoint, Throwable ex) {
log.warn("[AFTER-THROWING] metod: {} | xəta: {}",
joinPoint.getSignature().toShortString(),
ex.getMessage());
}
@After("execution(public * az.etibarli.demoaop.step2.service..*(..))")
public void logAfter(JoinPoint joinPoint) {
log.info("[AFTER] metod: {} (həmişə işləyir)",
joinPoint.getSignature().toShortString());
}
}
3. @Around
Metoddan evvel kod (log, auth yoxlamasi, timer start)
proceed() ile metodu ishe salmaq
neticeni deyishmek veya oldugu kimi qaytarmaq
Exception-u tutmaq, loglamaq, bashqa exception-a cevirmek
Harada istifade olunur?
Performance / timing - metodun ne qeder cekdiyini olcmek. Yavash endpointleri tapmaq, monitoring
Caching - evvel cache baxirsan, varsa -> proceed() cagirmirsan, cache-dan qaytarirsan, yoxdursa -> proceed(), neticeni cache-e yazirsan
Retry - xeta olanda eyni proceed() 2-3 defe tekrarlamaq
Комментарии
Отправить комментарий