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




















Комментарии

Популярные сообщения из этого блога

Interview questions

Lesson1: JDK, JVM, JRE

Lesson_2: Operations in Java