Spring AOP (Aspect-Oriented Programming) স্প্রিং ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ অংশ যা ক্রস-কাটিং কনসার্ন (cross-cutting concerns) ম্যানেজ করতে সহায়তা করে। AOP এর মধ্যে Pointcut Expressions ব্যবহৃত হয় যা টার্গেট মেথডের সিলেকশন নির্ধারণ করে। Pointcut expressions এর মাধ্যমে আমরা বিভিন্ন ধরনের এক্সপ্রেশন তৈরি করতে পারি যেমন execution, within, this, এবং target।
এই টিউটোরিয়ালে আমরা স্প্রিং AOP এর execution, within, this, এবং target এক্সপ্রেশন সম্পর্কে বিস্তারিত আলোচনা করব এবং কিভাবে এগুলো ব্যবহৃত হয় তা দেখব।
Execution Expression
Execution Expression হল Spring AOP এ সবচেয়ে সাধারণ এবং শক্তিশালী পয়েন্টকাট এক্সপ্রেশন। এটি ব্যবহৃত হয় নির্দিষ্ট মেথড বা মেথড গ্রুপের জন্য একটি এক্সপ্রেশন তৈরি করতে, যা টার্গেট মেথডের সিগনেচার (যেমন মেথডের নাম, রিটার্ন টাইপ, এবং আর্গুমেন্ট টাইপ) অনুযায়ী কার্যকর হয়।
Syntax:
execution(modifiers-pattern? return-type-pattern method-name-pattern(parameter-pattern) throws-pattern?)
- modifiers-pattern: মেথডের অ্যাক্সেস মডিফায়ার (যেমন
public,private) নির্ধারণ করতে পারে। - return-type-pattern: মেথডের রিটার্ন টাইপ (যেমন
void,Stringইত্যাদি)। - method-name-pattern: মেথডের নাম (যেমন
performActionবা*সবার জন্য)। - parameter-pattern: মেথডের প্যারামিটার (যেমন
String,..সমস্ত প্যারামিটার ইত্যাদি)। - throws-pattern: মেথডের কোনও এক্সসেপশন কি throws করছে তা নির্ধারণ করে।
উদাহরণ: Execution Expression
@Aspect
@Component
public class LoggingAspect {
// মেথড কল হওয়ার আগে একটি লগ মেসেজ
@Before("execution(public void com.example.service.MyService.performAction(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before executing method: " + joinPoint.getSignature().getName());
}
// কোনো মেথডের রিটার্ন টাইপ এবং প্যারামিটার ছাড়া শুধু নাম দিয়েও কাজ করা যাবে
@Before("execution(* com.example.service.MyService.*(..))")
public void logAnyMethod(JoinPoint joinPoint) {
System.out.println("Before executing method: " + joinPoint.getSignature().getName());
}
}
এখানে:
execution(public void com.example.service.MyService.performAction(..))ব্যবহার করে আমরাMyServiceক্লাসেরperformActionমেথডের জন্য Before Advice নির্ধারণ করেছি।
Within Expression
Within Expression ব্যবহৃত হয় নির্দিষ্ট প্যাকেজ, ক্লাস, বা মেথডের মধ্যে একটি পয়েন্টকাট তৈরি করতে। এটি সহজ এবং দ্রুত পদ্ধতিতে নির্দিষ্ট একটি ক্লাস বা প্যাকেজের মধ্যে সমস্ত মেথডের জন্য পয়েন্টকাট প্রয়োগ করতে সাহায্য করে।
Syntax:
within(package-pattern or class-pattern)
উদাহরণ: Within Expression
@Aspect
@Component
public class LoggingAspect {
// এই পয়েন্টকাটটি সমস্ত MyService ক্লাসের মেথডগুলির জন্য কার্যকর হবে
@Before("within(com.example.service.MyService)")
public void logServiceMethods(JoinPoint joinPoint) {
System.out.println("Before executing method: " + joinPoint.getSignature().getName());
}
// সমস্ত com.example.service প্যাকেজের মেথডগুলির জন্য কার্যকর
@Before("within(com.example.service..*)")
public void logAllServiceMethods(JoinPoint joinPoint) {
System.out.println("Before executing method: " + joinPoint.getSignature().getName());
}
}
এখানে:
within(com.example.service.MyService)পয়েন্টকাটটি শুধুMyServiceক্লাসের মেথডগুলির জন্য কার্যকর হবে।within(com.example.service..*)পয়েন্টকাটটিcom.example.serviceপ্যাকেজের সব মেথডের জন্য কার্যকর হবে।
This Expression
This Expression ব্যবহৃত হয় কোনো বীন বা অবজেক্টের রেফারেন্সের ভিত্তিতে পয়েন্টকাট তৈরি করতে। এটি নির্ধারণ করে যে পয়েন্টকাট শুধুমাত্র সেই অবজেক্টে কার্যকর হবে যেটি একটি নির্দিষ্ট বীন টাইপের ইনস্ট্যান্স।
Syntax:
this(bean-name)
উদাহরণ: This Expression
@Aspect
@Component
public class LoggingAspect {
// এই পয়েন্টকাটটি শুধু MyService বীন (bean) এর জন্য কার্যকর হবে
@Before("this(com.example.service.MyService)")
public void logServiceMethods(JoinPoint joinPoint) {
System.out.println("Before executing method: " + joinPoint.getSignature().getName());
}
}
এখানে:
this(com.example.service.MyService)পয়েন্টকাটটি শুধুমাত্রMyServiceবীন টাইপের ইনস্ট্যান্সের জন্য কার্যকর হবে।
Target Expression
Target Expression ব্যবহৃত হয় কোনো টার্গেট অবজেক্টের টাইপ বা কনটেক্সটের ভিত্তিতে পয়েন্টকাট তৈরি করতে। এটি নির্ধারণ করে যে, পয়েন্টকাট সেই মেথডগুলিতে কার্যকর হবে যেগুলির টার্গেট একটি নির্দিষ্ট টাইপের অবজেক্ট।
Syntax:
target(bean-name)
উদাহরণ: Target Expression
@Aspect
@Component
public class LoggingAspect {
// এই পয়েন্টকাটটি শুধু MyService বীন (bean) এর জন্য কার্যকর হবে
@Before("target(com.example.service.MyService)")
public void logServiceMethods(JoinPoint joinPoint) {
System.out.println("Before executing method: " + joinPoint.getSignature().getName());
}
}
এখানে:
target(com.example.service.MyService)পয়েন্টকাটটি শুধুমাত্রMyServiceটার্গেট অবজেক্টের জন্য কার্যকর হবে।
সারাংশ
- Execution: এটি একটি শক্তিশালী পয়েন্টকাট এক্সপ্রেশন যা মেথড সিগনেচারের উপর ভিত্তি করে কার্যকর হয় (যেমন মেথডের নাম, রিটার্ন টাইপ, প্যারামিটার ইত্যাদি)।
- Within: এটি প্যাকেজ বা ক্লাসের ভিত্তিতে পয়েন্টকাট তৈরি করে, যার মাধ্যমে নির্দিষ্ট প্যাকেজ বা ক্লাসের সকল মেথড সিলেক্ট করা যায়।
- This: এটি বীন টাইপের ভিত্তিতে পয়েন্টকাট তৈরি করে, যার মাধ্যমে নির্দিষ্ট বীন টাইপের ইনস্ট্যান্সে অ্যাডভাইস কার্যকর হয়।
- Target: এটি টার্গেট অবজেক্টের টাইপের ভিত্তিতে পয়েন্টকাট তৈরি করে, যেখানে টার্গেট অবজেক্ট একটি নির্দিষ্ট টাইপের হবে।
Spring AOP এর এই এক্সপ্রেশনগুলি ব্যবহার করে আপনি সহজেই কার্যকরীভাবে পয়েন্টকাট তৈরি করতে পারেন, যেগুলি বিভিন্ন মেথড, ক্লাস, বা অবজেক্টের উপর ভিত্তি করে কার্যকরী হয়।