Join Point কি?
Join Point হল AOP-তে এমন একটি নির্দিষ্ট পয়েন্ট যা একটি অ্যাপ্লিকেশনের কার্যকারিতায় এক্সিকিউট করা যায়, এবং যেখানে একটি Advice কার্যকরী হতে পারে। সহজভাবে বলতে, এটি হল একটি Join Point যেখানে Advice বা AOP এর অন্যান্য ক্রস-কাটিং কনসার্ন প্রযোজ্য হবে।
স্প্রিং AOP-তে, একটি Join Point সাধারণত একটি মেথড কল বা একটি কনস্ট্রাকটরের ইনভোকেশন হতে পারে। এটি এমন একটি স্থানে তৈরি হয় যেখানে আপনি Advice কার্যকর করতে চান।
স্প্রিং AOP-এ Join Point মেথডের কলের আগে, পরে বা ইন্টারসেপ্ট করার জন্য হতে পারে, যা নিম্নলিখিত হতে পারে:
- Method Execution: কোনো মেথড কল করার আগে বা পরে কাজ করা।
- Constructor Execution: কোনো কন্সট্রাকটরের কল হওয়ার আগে বা পরে কাজ করা।
Join Point এর উদাহরণ
ধরা যাক, একটি MyService ক্লাসে একটি মেথড আছে এবং আপনি Before Advice প্রয়োগ করতে চান, তাহলে method execution হবে একটি Join Point যেখানে আপনার Advice কার্যকর হবে।
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.MyService.*(..))") // Join Point
public void logBeforeMethodExecution() {
System.out.println("Method is about to execute");
}
}
এখানে, execution(* com.example.service.MyService.*(..)) পয়েন্টকাট এক্সপ্রেশনটি একটি Join Point নির্দেশ করছে যেখানে MyService ক্লাসের যেকোনো মেথড কল হওয়ার আগে logBeforeMethodExecution মেথডটি কার্যকরী হবে।
Pointcut Expressions কি?
Pointcut Expressions হল সেই এক্সপ্রেশন যা Join Point গুলি সিলেক্ট করতে ব্যবহৃত হয়। এটি স্পষ্টভাবে নির্দেশ করে যে কোন Join Point-এ Advice কার্যকরী হবে। স্প্রিং AOP-তে, আপনি execution বা অন্যান্য কাস্টম এক্সপ্রেশন ব্যবহার করে কোন মেথড, কনস্ট্রাক্টর, প্যাকেজ বা ক্লাসে Advice প্রয়োগ করবেন তা নির্ধারণ করতে পারেন।
Pointcut Expressions এর ধরনের
- execution(Expression): এটি AOP-তে সবচেয়ে সাধারণ পয়েন্টকাট এক্সপ্রেশন। এটি মেথডের এক্সিকিউশন পয়েন্টকে নির্দিষ্ট করে, যেখানে আপনি
Adviceচালাতে চান। - within(Expression): এটি স্পেসিফিক ক্লাস বা প্যাকেজের মধ্যে
Adviceপ্রয়োগ করার জন্য ব্যবহার করা হয়। - @annotation(Expression): এটি একটি
@Annotationঅ্যাট্রিবিউট দিয়ে মেথড বা ক্লাসের উপরAdviceপ্রয়োগ করে। - args(Expression): এটি মেথডের আর্গুমেন্ট অনুযায়ী
Adviceপ্রয়োগ করতে সাহায্য করে।
1. Execution Pointcut Expression
execution পয়েন্টকাট এক্সপ্রেশন সবচেয়ে সাধারণ এবং শক্তিশালী। এটি Join Point গুলি সিলেক্ট করতে ব্যবহৃত হয় যেখানে মেথড এক্সিকিউট হবে।
@Before("execution(public void com.example.service.MyService.performTask())")
public void logBefore() {
System.out.println("performTask method is about to be executed");
}
এখানে, execution(public void com.example.service.MyService.performTask()) পয়েন্টকাট এক্সপ্রেশনটি performTask() মেথডের এক্সিকিউশনের আগে Advice চালাবে।
execution(Expression) এর সাইনট্যাক্স:
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
- modifiers-pattern: মেথডের মডিফায়ার (যেমন
public,private)। - return-type-pattern: মেথডের রিটার্ন টাইপ।
- declaring-type-pattern: ক্লাস বা ইন্টারফেসের প্যাকেজ বা নাম।
- method-name-pattern: মেথডের নাম।
- param-pattern: প্যারামিটার প্রকার।
- throws-pattern: মেথড যে exception গুলি থ্রো করে।
উদাহরণ:
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeAllMethods() {
System.out.println("A method in MyService is about to be executed");
}
এখানে, * com.example.service.*.*(..) সমস্ত মেথডের জন্য Advice প্রয়োগ করবে যা com.example.service প্যাকেজের মধ্যে রয়েছে।
2. Within Pointcut Expression
within পয়েন্টকাট এক্সপ্রেশনটি ক্লাসের মধ্যে Advice কার্যকর করার জন্য ব্যবহার হয়।
@Before("within(com.example.service.*)")
public void logBeforeAllServiceMethods() {
System.out.println("A method in MyService is about to be executed");
}
এখানে, within(com.example.service.*) প্যাকেজের সমস্ত ক্লাসের মেথডে Advice প্রয়োগ করবে।
3. @annotation Pointcut Expression
@annotation পয়েন্টকাট এক্সপ্রেশনটি সেই মেথডগুলির জন্য Advice প্রয়োগ করে যেগুলিতে নির্দিষ্ট কোনো অ্যানোটেশন ব্যবহার করা হয়েছে।
@Before("@annotation(com.example.annotation.Loggable)")
public void logBeforeLoggableMethods() {
System.out.println("A method annotated with @Loggable is about to execute");
}
এখানে, @annotation(com.example.annotation.Loggable) সমস্ত মেথডগুলিতে Advice প্রয়োগ করবে যেগুলিতে @Loggable অ্যানোটেশন থাকবে।
4. Args Pointcut Expression
args পয়েন্টকাট এক্সপ্রেশনটি মেথডের আর্গুমেন্ট এর ধরন নির্ধারণ করে, যা Advice প্রয়োগ করার জন্য ব্যবহৃত হয়।
@Before("args(String, int)")
public void logBeforeMethodWithArgs(String name, int value) {
System.out.println("Method with String and int arguments is about to execute");
}
এখানে, args(String, int) শুধুমাত্র সেই মেথডগুলোতে Advice প্রয়োগ করবে যেগুলির প্যারামিটার হিসাবে একটি String এবং একটি int রয়েছে।
AOP এর Join Point এবং Pointcut Expression এর সুবিধা
- ক্রস-কাটিং কনসার্ন আলাদা করা: AOP এর মাধ্যমে ক্রস-কাটিং কনসার্ন যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট ইত্যাদি মূল লজিক থেকে আলাদা করা সম্ভব হয়।
- প্রোগ্রামিংয়ে পরিষ্কারতা:
Join PointএবংPointcut Expressionব্যবহার করে কোডের পুনঃব্যবহারযোগ্যতা বাড়ানো যায়, এবং কোডের স্পষ্টতা বৃদ্ধি পায়। - ফ্লেক্সিবিলিটি:
Pointcut Expressionsএর মাধ্যমে আপনি নির্দিষ্ট জায়গায়Adviceপ্রয়োগ করতে পারেন, যা কোডের কার্যকারিতা বাড়ায় এবং ইন্টিগ্রেশন সহজ করে।
সারাংশ
স্প্রিং AOP-তে Join Point হল সেই স্থানে যেখানে আপনি Advice প্রযোজ্য করতে চান, যেমন একটি মেথডের কল। Pointcut Expressions এর মাধ্যমে আপনি নির্দিষ্ট Join Point গুলি সিলেক্ট করতে পারেন, যা স্প্রিং AOP-এ Advice কার্যকরী করার জন্য ব্যবহৃত হয়। execution, within, @annotation, এবং args এর মতো বিভিন্ন পয়েন্টকাট এক্সপ্রেশন ব্যবহার করে আপনি AOP কার্যক্রমকে আরও নমনীয় এবং কার্যকরীভাবে কনফিগার করতে পারবেন।
Spring AOP (Aspect-Oriented Programming) একটি শক্তিশালী পদ্ধতি যা ক্রস-কাটিং কনসার্ন (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট) ম্যানেজ করার জন্য ব্যবহৃত হয়। AOP এর মাধ্যমে আপনি একটি অ্যাসপেক্ট তৈরি করতে পারেন, যা একটি বিশেষ অংশের উপর (যেমন একটি মেথড কল বা কনস্ট্রাক্টর) ক্রিয়াকলাপ প্রয়োগ করে।
Join Point এবং Pointcut Expressions AOP এর মূল ধারণা এবং তারা AOP এর কার্যকারিতা নির্ধারণ করতে সাহায্য করে।
১. Join Point
Join Point হলো একটি নির্দিষ্ট পয়েন্ট যা প্রোগ্রাম এক্সিকিউশন চলাকালে AOP Advice প্রয়োগ করা হবে। একটি Join Point সাধারণত একটি মেথড কল, কনস্ট্রাক্টর এক্সিকিউশন, অথবা একটি ফিল্ড অ্যাক্সেস হতে পারে।
- Spring AOP এ, Join Point সাধারণত method execution বা constructor execution হিসেবে ব্যবহৃত হয়।
- AOP এ Advice এর কাজ Join Point এর উপর প্রয়োগ করা হয়। এর মাধ্যমে, AOP একটি মেথড বা কনস্ট্রাক্টর কলের আগে, পরে, বা চারপাশে ক্রিয়াকলাপ করতে পারে।
Join Point এর উদাহরণ:
ধরা যাক, আপনি একটি UserService ক্লাসে লগিং অ্যাসপেক্ট যুক্ত করতে চান:
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.UserService.getUserById(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Before executing method: " + joinPoint.getSignature().getName());
}
}
এখানে, getUserById মেথডের কল একটি Join Point। @Before অ্যাডভাইসটি মেথডের কলের আগে কার্যকর হবে এবং লগ মেসেজ প্রিন্ট করবে।
২. Pointcut Expressions
Pointcut Expressions হল একটি নির্দিষ্ট এক্সপ্রেশন যা AOP কে জানায় কোন Join Point এ কোন Advice কার্যকর হবে। এটি AOP এর সবচেয়ে গুরুত্বপূর্ণ দিক, কারণ এটি নির্ধারণ করে কোথায় Advice প্রয়োগ করতে হবে। Pointcut Expressions সাধারণত execution(), within(), args() ইত্যাদি যেমন অভ্যন্তরীণ এক্সপ্রেশন দিয়ে সংজ্ঞায়িত করা হয়।
Pointcut Expressions এর সাধারণ সিনট্যাক্স
@Pointcut("execution(public * com.example.service.*.*(..))")
public void serviceMethods() {}
এখানে, execution(public * com.example.service.*.*(..)) একটি Pointcut Expression যা com.example.service প্যাকেজের সব পাবলিক মেথডের উপর কাজ করবে।
Pointcut Expressions এর বিভিন্ন ধরন
execution(): এটি সবচেয়ে সাধারণ এবং শক্তিশালী Pointcut Expression। এর মাধ্যমে আপনি মেথডের সিগনেচার, রিটার্ন টাইপ, ক্লাস এবং প্যারামিটার অনুযায়ী মেথডের সাথে সম্পর্কিত Join Points নির্বাচন করতে পারেন।
উদাহরণ:
@Pointcut("execution(* com.example.service.UserService.*(..))") public void allUserServiceMethods() {}এখানে, সব
UserServiceক্লাসের মেথডের জন্য Advice কার্যকর হবে।within(): এটি একটি প্যাকেজ বা ক্লাসের মধ্যে সমস্ত মেথডের জন্য Pointcut নির্ধারণ করে। এটি মেথডের সিগনেচার দেখতে চায় না, শুধু ক্লাস বা প্যাকেজের উপর ফোকাস করে।
উদাহরণ:
@Pointcut("within(com.example.service.UserService)") public void userServiceMethods() {}এটি
UserServiceক্লাসের সমস্ত মেথডের জন্য কার্যকর হবে।args(): এটি প্যারামিটার অনুযায়ী মেথডের Join Point নির্বাচন করতে ব্যবহৃত হয়।
উদাহরণ:
@Pointcut("execution(* com.example.service.UserService.updateUser(..)) && args(user)") public void updateUserMethod(User user) {}এটি শুধুমাত্র
updateUserমেথডটি নির্বাচন করবে, যেখানে একটিUserপ্যারামিটার পাস করা হচ্ছে।@annotation(): এই পয়েন্টকাট এক্সপ্রেশন ব্যবহার করে আপনি সেই মেথডগুলির জন্য Advice প্রয়োগ করতে পারেন যেগুলিতে একটি নির্দিষ্ট অ্যানোটেশন রয়েছে।
উদাহরণ:
@Pointcut("@annotation(com.example.annotations.Loggable)") public void loggableMethods() {}এটি সব মেথডের জন্য কার্যকর হবে যেখানে
@Loggableঅ্যানোটেশন ব্যবহার করা হয়েছে।
Join Point এবং Pointcut Expressions এর মধ্যে পার্থক্য
| বিষয় | Join Point | Pointcut Expressions |
|---|---|---|
| সংজ্ঞা | প্রোগ্রামের নির্দিষ্ট পয়েন্ট যেখানে AOP Advice কার্যকর হয়। | একটি এক্সপ্রেশন যা নির্ধারণ করে কোথায় Advice প্রয়োগ করা হবে। |
| ব্যবহার | একটি নির্দিষ্ট মেথড কল বা কনস্ট্রাক্টর এক্সিকিউশন যা AOP তে কাজ করবে। | মেথডের সিগনেচার, প্যাকেজ, ক্লাস, বা প্যারামিটার নিয়ে AOP এর কার্যক্রম নির্ধারণ করে। |
| চিহ্নিত করা হয় কিভাবে | AOP ক্লাসে JoinPoint ব্যবহার করে। | AOP ক্লাসে @Pointcut ব্যবহার করে। |
| ভুমিকা | মেথড কল বা কনস্ট্রাক্টর এক্সিকিউশন ইত্যাদি হতে পারে। | যেখান AOP Advice কার্যকর হবে সেই নির্দিষ্ট Join Point নির্বাচন করে। |
Conclusion
Join Point এবং Pointcut Expressions AOP এর মূল উপাদান। Join Point একটি নির্দিষ্ট পয়েন্ট যেখানে AOP Advice কার্যকর হবে, যেমন মেথড কল। Pointcut Expressions এই Join Point গুলির জন্য এক্সপ্রেশন নির্ধারণ করে, যেখানে Advice প্রয়োগ হবে। Spring AOP এর মাধ্যমে আপনি কার্যকরভাবে Advice প্রয়োগ করে ক্রস-কাটিং কনসার্ন (যেমন লগিং, সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট) কোডের মধ্যে একত্রিত করতে পারেন, যা অ্যাপ্লিকেশনের মেইন লজিকের বাইরে থাকে।
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 এর এই এক্সপ্রেশনগুলি ব্যবহার করে আপনি সহজেই কার্যকরীভাবে পয়েন্টকাট তৈরি করতে পারেন, যেগুলি বিভিন্ন মেথড, ক্লাস, বা অবজেক্টের উপর ভিত্তি করে কার্যকরী হয়।
Pointcut Expressions স্প্রিং AOP (Aspect-Oriented Programming) এর একটি গুরুত্বপূর্ণ অংশ যা নির্ধারণ করে যে কোন মেথড বা ক্লাসের উপর অ্যাডভাইস (Advice) প্রয়োগ হবে। এটি Join Points চিহ্নিত করতে সাহায্য করে, অর্থাৎ যেখানে আপনার অ্যাসপেক্টের কাস্টম লজিক প্রয়োগ করা হবে। স্প্রিং AOP তে Pointcut হল এমন একটি অভিব্যক্তি (expression) যা টার্গেট মেথডগুলিকে নির্বাচন করতে ব্যবহৃত হয়, এবং Advice সেই নির্বাচিত মেথডগুলির উপর কার্যকর হয়।
Pointcut Expressions এর ধরন
স্প্রিং AOP তে Pointcut Expressions বেশ কিছু ভিন্ন ধরনে ব্যবহৃত হয়, যেমন:
- execution(): মেথড এক্সিকিউশনের উপর ভিত্তি করে
- within(): নির্দিষ্ট প্যাকেজ বা ক্লাসের মধ্যে
- args(): মেথডের প্যারামিটার টাইপের উপর ভিত্তি করে
- @annotation(): নির্দিষ্ট অ্যানোটেশন সহ মেথডের উপর ভিত্তি করে
Pointcut Expressions এর সাধারণ গঠন
@Pointcut("execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(parameter-pattern) throws-pattern?)")
public void pointcutExpression() {}
এখানে:
execution()হল সবচেয়ে সাধারণ এবং গুরুত্বপূর্ণ পয়েন্টকাট এক্সপ্রেশন, যা মেথডের সিগনেচার নির্ধারণ করে।modifiers-pattern?(ঐচ্ছিক) মেথডের মডিফায়ার যেমনpublic,privateইত্যাদি।return-type-pattern?মেথডের রিটার্ন টাইপ (যেমনvoid,Stringইত্যাদি)।declaring-type-pattern?মেথডটি যে ক্লাসে বা ইন্টারফেসে অবস্থিত।method-name-patternমেথডের নাম।parameter-patternমেথডের প্যারামিটার টাইপ।throws-pattern?মেথডের থ্রো করা এক্সেপশন।
উদাহরণ সহ Pointcut Expressions ব্যবহার
Step 1: Service Class (Target Methods)
প্রথমে একটি EmployeeService ক্লাস তৈরি করি যার মধ্যে কিছু মেথড রয়েছে।
public class EmployeeService {
public void addEmployee(String name) {
System.out.println(name + " added successfully!");
}
public void deleteEmployee(String name) {
System.out.println(name + " deleted successfully!");
}
public String getEmployeeInfo(int id) {
return "Employee info for id: " + id;
}
}
এখানে, আমাদের EmployeeService ক্লাসে তিনটি মেথড রয়েছে: addEmployee(), deleteEmployee(), এবং getEmployeeInfo()।
Step 2: Aspect Class with Pointcut Expressions
এখন, আমরা একটি Aspect ক্লাস তৈরি করব, যেখানে বিভিন্ন ধরনের Pointcut Expressions ব্যবহার করে Advice প্রয়োগ করা হবে।
@Aspect
@Component
public class LoggingAspect {
// Pointcut expression for all methods in EmployeeService
@Pointcut("execution(* EmployeeService.*(..))")
public void allMethodsInEmployeeService() {}
// Before advice using the above pointcut
@Before("allMethodsInEmployeeService()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before method execution: " + joinPoint.getSignature().getName());
}
// Pointcut expression for methods with specific parameter types (String)
@Pointcut("execution(* EmployeeService.addEmployee(String))")
public void addEmployeeMethodWithStringParam() {}
// After advice for methods that match the above pointcut
@After("addEmployeeMethodWithStringParam()")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After method execution: " + joinPoint.getSignature().getName());
}
// Pointcut expression for methods with a return type of String
@Pointcut("execution(String EmployeeService.getEmployeeInfo(..))")
public void getEmployeeInfoMethod() {}
// Around advice for the method matching the above pointcut
@Around("getEmployeeInfoMethod()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before around advice: " + joinPoint.getSignature().getName());
Object result = joinPoint.proceed();
System.out.println("After around advice: " + joinPoint.getSignature().getName());
return result;
}
}
Explanation:
@Pointcut("execution(* EmployeeService.*(..))"): এই পয়েন্টকাট এক্সপ্রেশনটিEmployeeServiceক্লাসের সব মেথডের উপর প্রয়োগ হবে।execution()দ্বারা মেথডের সিগনেচার নির্বাচন করা হয়, যেখানে*অর্থ যে কোন রিটার্ন টাইপ, এবং(..)অর্থ যে কোনো প্যারামিটার।@Before("allMethodsInEmployeeService()"): এই অ্যাডভাইসটিallMethodsInEmployeeService()পয়েন্টকাটের জন্য আগে কার্যকর হবে। অর্থাৎ, যখনইEmployeeServiceএর কোনো মেথড কল হবে, তখন এটি তার আগে কার্যকর হবে।@Pointcut("execution(* EmployeeService.addEmployee(String))"): এখানেaddEmployee()মেথডের জন্য পয়েন্টকাট এক্সপ্রেশন তৈরি করা হয়েছে, যা শুধুStringপ্যারামিটার গ্রহণকারীaddEmployeeমেথডের উপর কাজ করবে।@After("addEmployeeMethodWithStringParam()"): এই অ্যাডভাইসটিaddEmployee()মেথডের পরে কার্যকর হবে। এটিaddEmployeeমেথডের কলের পরে লগিং করবে।@Pointcut("execution(String EmployeeService.getEmployeeInfo(..))"): এই পয়েন্টকাট এক্সপ্রেশনটিgetEmployeeInfo()মেথডের জন্য তৈরি করা হয়েছে, যাStringরিটার্ন টাইপ সহ।@Around("getEmployeeInfoMethod()"): এটি একটি Around Advice, যাgetEmployeeInfo()মেথডের আগে এবং পরে কার্যকর হবে। এটি মেথডের এক্সিকিউশনের আগেই কিছু লজিক এবং পরে কিছু লজিক প্রয়োগ করতে সাহায্য করে।
Step 3: Configuration Class
স্প্রিং কনটেক্সটের জন্য এএফপি (AOP) সক্রিয় করতে আপনাকে @EnableAspectJAutoProxy অ্যানোটেশন ব্যবহার করতে হবে।
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.example") // আপনার প্যাকেজ স্ক্যান করুন
public class AppConfig {
}
Step 4: Main Application
এখন, আমাদের স্প্রিং অ্যাপ্লিকেশন তৈরি করে মেথডগুলো কল করব।
public class MainApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
EmployeeService employeeService = context.getBean(EmployeeService.class);
// মেথড কল করব যাতে Pointcut Expressions কার্যকর হয়
employeeService.addEmployee("John");
employeeService.deleteEmployee("Alice");
System.out.println(employeeService.getEmployeeInfo(101));
context.close();
}
}
Output:
Before method execution: addEmployee
After method execution: addEmployee
Before around advice: getEmployeeInfo
After around advice: getEmployeeInfo
এখানে, Before এবং After অ্যাডভাইস যথাক্রমে মেথড কলের আগে এবং পরে কার্যকর হয়েছে, এবং Around অ্যাডভাইস getEmployeeInfo মেথডের আগে এবং পরে কার্যকর হয়েছে।
Conclusion
স্প্রিং AOP তে Pointcut Expressions ব্যবহার করে আপনি নির্দিষ্ট মেথড বা ক্লাসের উপর অ্যাডভাইস প্রয়োগ করতে পারেন। execution(), within(), args(), @annotation() ইত্যাদি পয়েন্টকাট এক্সপ্রেশন স্প্রিং এওপিতে খুবই শক্তিশালী এবং উপকারী। এটি ক্রস-কাটিং কনসার্ন (যেমন লগিং, সিকিউরিটি) আলাদাভাবে এবং আরো কার্যকরভাবে পরিচালনা করতে সাহায্য করে।
Read more