Aspects & Advice
ASPECT ek CLASS hai (@Aspect + @Component) jo CROSS-CUTTING logic CONTAIN karta hai. Iske ANDAR ADVICE METHODS hote hain — HAR ek EK SPECIFIC TIMING par run hota hai. @Before (target method se PEHLE), @After (HAMESHA baad mein, success ho ya fail), @AfterReturning (sirf SUCCESS par), @AfterThrowing (sirf EXCEPTION par), @Around (SABSE POWERFUL — poori method call ko CONTROL kar sakta hai).
@Around advice SABSE FLEXIBLE hai — ProceedingJoinPoint.proceed() CALL karके actual method INVOKE hota hai, aur uske RESULT ko MODIFY, ya EXECUTION SKIP bhi kiya ja sakta hai (jaise caching — agar cache mein value hai, actual method CALL hi mat karo).
@Aspect
@Component
public class TimingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // actual method chalता hai
long time = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " took " + time + "ms");
return result;
}
@AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
public void logException(Exception ex) {
System.out.println("Exception occurred: " + ex.getMessage());
}
}- @Before/@After/@AfterReturning/@AfterThrowing/@Around = advice types
- @Around SABSE POWERFUL — proceed() se method invoke, result modify kar sakta hai
- @Aspect + @Component = ek aspect class
@Before advice target method se PEHLE run hota hai (logging entry). @After HAMESHA baad mein run hota hai (success ho ya exception). @AfterReturning sirf SUCCESSFUL completion par. @AfterThrowing sirf EXCEPTION par. @Around SABSE POWERFUL hai — method call ko POORI TARAH control kar sakta hai (execute karna hai ya nahi, result modify karna).
@Around("execution(* com.example.service.*.*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // actual method call
long duration = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " took " + duration + "ms");
return result;
}Ek aspect ek NORMAL @Component class hai, @Aspect annotation ke saath — is class ke ANDAR MULTIPLE advice methods ho sakte hain, HAR ek DIFFERENT pointcut ke saath. @EnableAspectJAutoProxy (ya Spring Boot mein automatic) AOP ko ENABLE karta hai.
- @Aspect + @Component = ek aspect class
- Aspect ke andar MULTIPLE advice methods ho sakte hain
- Spring Boot mein AOP automatically enabled hota hai (starter-aop se)