Spring AOP (Aspect-Oriented Programming) এর মধ্যে Advice একটি গুরুত্বপূর্ণ কনসেপ্ট, যা একটি Aspect এর মধ্যে কার্যকরী হয় এবং একটি Joinpoint এ নির্দিষ্ট কাজ সম্পাদন করে। Spring AOP-এ বিভিন্ন ধরনের Advice রয়েছে, যা বিভিন্ন পরিস্থিতিতে একটি মেথডের আগে, পরে বা মেথড চলাকালীন কার্যকরী হতে পারে।
Spring AOP এর মধ্যে Advice এর পাঁচটি প্রধান ধরন রয়েছে:
- Before Advice
- After Advice
- AfterReturning Advice
- AfterThrowing Advice
- Around Advice
এই প্রতিটি Advice এর কাজের ধরন এবং ব্যবহারের উদাহরণগুলো নীচে দেওয়া হলো।
১. Before Advice
Before Advice মেথড কল হওয়ার আগে কার্যকরী হয়। যখন কোনো মেথড কল করা হয়, তখন Before Advice মেথডটি রান করবে, কিন্তু মেথড কল হওয়ার আগে।
ব্যবহার:
- লগিং, অথেনটিকেশন, প্রিভ্যালিডেশন, অথবা অন্য কোনো কাজ যা মেথড কলের আগে করতে হবে।
উদাহরণ:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod() {
System.out.println("Method is about to be called.");
}
}
ব্যাখ্যা:
@Beforeএনোটেশন ব্যবহার করা হয়েছে মেথড কল হওয়ার আগেlogBeforeMethod()মেথডটি কার্যকরী করার জন্য।
২. After Advice
After Advice মেথড কল হওয়ার পর, তবে সফল বা ব্যর্থ হওয়ার পরেও এটি কার্যকরী হয়। এটি মূলত মেথড কলের পর যেকোনো কাজ করার জন্য ব্যবহৃত হয়।
ব্যবহার:
- ডিবাগging, মেটাডেটা ট্র্যাকিং, অথবা মেথড শেষে কিছু ফাইনাল কাজ করার জন্য।
উদাহরণ:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@After("execution(* com.example.service.*.*(..))")
public void logAfterMethod() {
System.out.println("Method has been called.");
}
}
ব্যাখ্যা:
@Afterএনোটেশন ব্যবহার করা হয়েছে, যাতে কোনো মেথড কল হওয়ার পরlogAfterMethod()কার্যকরী হয়।
৩. AfterReturning Advice
AfterReturning Advice কেবলমাত্র সফল মেথড কল হওয়ার পরে কার্যকরী হয়। এটি মূলত মেথডের রিটার্ন ভ্যালু প্রাপ্ত হওয়ার পরে চলে, অর্থাৎ যদি মেথড সফলভাবে সম্পন্ন হয়।
ব্যবহার:
- মেথডের আউটপুট ট্র্যাক করা, ডিবাগিং, রিটার্ন ভ্যালুর লগিং ইত্যাদি।
উদাহরণ:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@AfterReturning(value = "execution(* com.example.service.*.*(..))", returning = "result")
public void logAfterReturning(Object result) {
System.out.println("Method returned: " + result);
}
}
ব্যাখ্যা:
@AfterReturningএনোটেশন ব্যবহার করা হয়েছে, যাতে মেথড সফলভাবে সম্পন্ন হওয়ার পরে আউটপুট হিসেবে রিটার্ন ভ্যালু লগ করা হয়। এখানেreturning = "result"দ্বারা আউটপুট প্যারামিটারটি নির্ধারণ করা হয়েছে।
৪. AfterThrowing Advice
AfterThrowing Advice তখন কার্যকরী হয় যখন কোনো মেথড এক্সসেপশন থ্রো করে। এটি বিশেষভাবে ভুল বা ত্রুটি হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়।
ব্যবহার:
- এক্সসেপশন লগিং, ত্রুটি পুনরুদ্ধার, অথবা পুনরায় চেষ্টা করার জন্য ব্যবহৃত হয়।
উদাহরণ:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@AfterThrowing(value = "execution(* com.example.service.*.*(..))", throwing = "exception")
public void logAfterThrowing(Exception exception) {
System.out.println("Exception thrown: " + exception.getMessage());
}
}
ব্যাখ্যা:
@AfterThrowingএনোটেশন ব্যবহার করা হয়েছে, যাতে মেথডের মধ্যে কোনো এক্সসেপশন হলেlogAfterThrowing()মেথডটি কার্যকরী হয় এবং এক্সসেপশন লগ করা হয়।
৫. Around Advice
Around Advice সবচেয়ে শক্তিশালী এবং ফ্লেক্সিবল Advice, যা মেথড কল হওয়ার আগে এবং পরে কার্যকরী হতে পারে। এটি মেথড কলের প্রক্রিয়াটি পুরোপুরি কাস্টমাইজ করতে সহায়তা করে। এর মাধ্যমে মেথড কলের আগে বা পরে প্রয়োজনীয় কাজ করা সম্ভব হয়, যেমন লগিং, সিকিউরিটি চেক, পারফরম্যান্স ট্র্যাকিং ইত্যাদি।
ব্যবহার:
- লগিং, প্রফাইলিং, সিকিউরিটি চেক, ট্রানজেকশন ম্যানেজমেন্ট, ক্যাশিং ইত্যাদি।
উদাহরণ:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.proceeding.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Method " + joinPoint.getSignature().getName() + " is about to be called.");
// Method execution
Object result = joinPoint.proceed();
System.out.println("Method " + joinPoint.getSignature().getName() + " has been called.");
return result;
}
}
ব্যাখ্যা:
@Aroundএনোটেশন ব্যবহার করা হয়েছে, যার মাধ্যমে মেথড কলের আগে এবং পরে কাজ করা হচ্ছে।joinPoint.proceed()মেথড কলের কার্যকরী অংশ চালায়।
সারাংশ
Spring AOP-এ Advice এর বিভিন্ন ধরন রয়েছে, যা বিভিন্ন পরিস্থিতিতে কার্যকরী হতে পারে। এগুলির মধ্যে:
- Before Advice: মেথড কল হওয়ার আগে কার্যকরী হয়।
- After Advice: মেথড কল হওয়ার পরে কার্যকরী হয়।
- AfterReturning Advice: মেথড সফলভাবে সম্পন্ন হলে কার্যকরী হয়।
- AfterThrowing Advice: মেথডে এক্সসেপশন থ্রো হলে কার্যকরী হয়।
- Around Advice: মেথড কল হওয়ার আগে এবং পরে কার্যকরী হয়, এবং এটি সবচেয়ে শক্তিশালী Advice।
এই Advice গুলি বিভিন্ন ক্রস-কাটিং কনসার্ন যেমন লগিং, অথেনটিকেশন, ট্রানজেকশন ম্যানেজমেন্ট, এবং সিকিউরিটি পরিচালনা করতে ব্যবহৃত হয়। Spring AOP একটি ফ্লেক্সিবল এবং শক্তিশালী উপাদান, যা মূল লজিক থেকে ক্রস-কাটিং কনসার্নগুলো আলাদা করে রক্ষণাবেক্ষণ এবং কোড পুনঃব্যবহারযোগ্যতা উন্নত করে।
Read more