Guice-এ, আপনি Custom Annotations তৈরি করে নির্দিষ্ট ডিপেনডেন্সির জন্য কাস্টম Binding তৈরি করতে পারেন। Custom Annotations ব্যবহারের মাধ্যমে আপনি নির্দিষ্ট কনফিগারেশন বা সিস্টেমের জন্য নির্দিষ্ট dependencies ইনজেক্ট করতে পারবেন। Guice-এর @BindingAnnotation অ্যানোটেশনটি ব্যবহার করে কাস্টম অ্যানোটেশন তৈরি করা হয়, যা ডিপেনডেন্সি ইনজেকশনের জন্য qualifier হিসাবে কাজ করে।
কেন Custom Annotations ব্যবহার করবেন?
- আপনি যখন একটি নির্দিষ্ট ধরনের ডিপেনডেন্সি কনফিগার করতে চান এবং সেই ডিপেনডেন্সি শ্রেণী বা ইন্টারফেসের মধ্যে ভিন্নতা নির্ধারণ করতে চান, তখন কাস্টম অ্যানোটেশন খুবই সহায়ক।
- এটি বিশেষ ধরনের ডিপেনডেন্সি সরবরাহ করার সময় ডিপেনডেন্সি গুলির মধ্যে বৈশিষ্ট্য বা ভিন্নতা নির্ধারণ করতে পারে।
Custom Annotation তৈরি এবং Binding Example
এখানে আমরা দেখব কিভাবে একটি কাস্টম অ্যানোটেশন তৈরি করে Guice-এর মাধ্যমে ডিপেনডেন্সি Binding করা যায়।
Step 1: Custom Annotation তৈরি করা
প্রথমে, একটি custom annotation তৈরি করতে হবে, যা Guice-এ binding qualifier হিসাবে কাজ করবে।
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import com.google.inject.BindingAnnotation;
@BindingAnnotation // Guice binding qualifier হিসাবে এই অ্যানোটেশনটি চিহ্নিত করা হচ্ছে।
@Retention(RetentionPolicy.RUNTIME) // এই অ্যানোটেশনটি runtime এ পাওয়া যাবে।
public @interface PaypalPayment {
}
এখন আমরা একটি @PaypalPayment নামের কাস্টম অ্যানোটেশন তৈরি করেছি, যেটি Guice-এ পেমেন্ট সার্ভিসের জন্য নির্দিষ্ট binding গুলি চিহ্নিত করবে।
Step 2: Dependency Interface এবং Implementations
এখানে আমরা PaymentService ইন্টারফেস এবং তার দুটি ভিন্ন বাস্তবায়ন তৈরি করব, যেখানে একটিতে @PaypalPayment অ্যানোটেশন ব্যবহার করা হবে।
public interface PaymentService {
void pay();
}
public class PaypalPaymentService implements PaymentService {
@Override
public void pay() {
System.out.println("Payment made via PayPal.");
}
}
public class CreditCardPaymentService implements PaymentService {
@Override
public void pay() {
System.out.println("Payment made via Credit Card.");
}
}
- এখানে দুটি
PaymentServiceইমপ্লিমেন্টেশন রয়েছে:PaypalPaymentServiceএবংCreditCardPaymentService।
Step 3: Guice Module-এ Custom Binding তৈরি করা
এখন আমাদের Guice Module তৈরি করতে হবে, যেখানে আমরা কাস্টম অ্যানোটেশন ব্যবহার করে নির্দিষ্ট ডিপেনডেন্সির জন্য binding নির্ধারণ করব।
import com.google.inject.AbstractModule;
public class PaymentModule extends AbstractModule {
@Override
protected void configure() {
// Default Binding for PaymentService
bind(PaymentService.class).to(CreditCardPaymentService.class);
// Custom Binding using @PaypalPayment annotation
bind(PaymentService.class).annotatedWith(PaypalPayment.class).to(PaypalPaymentService.class);
}
}
- এখানে,
bind(PaymentService.class).to(CreditCardPaymentService.class);দ্বারা default binding তৈরি করা হয়েছে, যেখানে কোন কাস্টম অ্যানোটেশন নেই, তবেbind(PaymentService.class).annotatedWith(PaypalPayment.class).to(PaypalPaymentService.class);দিয়ে custom binding তৈরি করা হয়েছে, যা@PaypalPaymentঅ্যানোটেশনটি ব্যবহার করবে।
Step 4: Guice Injector-এ Custom Annotation ব্যবহার করা
এখন আমরা Guice Injector ব্যবহার করে PaymentService ইন্টারফেসের জন্য নির্দিষ্ট ইমপ্লিমেন্টেশন ইনজেক্ট করতে পারব, যেখানে কাস্টম অ্যানোটেশন ব্যবহার করা হবে।
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class BillingService {
private final PaymentService paymentService;
// Constructor Injection using Custom Annotation @PaypalPayment
@Inject
public BillingService(@PaypalPayment PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processPayment() {
paymentService.pay();
}
public static void main(String[] args) {
// Creating Injector using the PaymentModule
Injector injector = Guice.createInjector(new PaymentModule());
// Getting BillingService instance where @PaypalPayment is injected
BillingService billingService = injector.getInstance(BillingService.class);
billingService.processPayment(); // Output: Payment made via PayPal.
}
}
Explanation:
BillingServiceকনস্ট্রাক্টর-এ@PaypalPaymentঅ্যানোটেশন ব্যবহার করা হয়েছে। এটি Guice-কে নির্দেশ করে যে,PaypalPaymentServiceক্লাস ইনজেক্ট করতে হবে।Injectorদ্বারা Guice নির্ধারিতPaymentServiceইন্টারফেসের জন্যPaypalPaymentServiceইনজেক্ট করবে, যেহেতু আমরা@PaypalPaymentঅ্যানোটেশন দিয়ে কাস্টম binding তৈরি করেছি।
Step 5: Output
Payment made via PayPal.
এখানে, BillingService PaypalPaymentService ইনজেক্ট করেছে, কারণ আমরা @PaypalPayment অ্যানোটেশন ব্যবহার করে সেটি Guice-এ কাস্টমভাবে bind করেছি।
Guice Custom Annotations এর সুবিধা
- Qualifier হিসাবে ব্যবহার: কাস্টম অ্যানোটেশন Guice-এ ডিপেনডেন্সি ইনজেকশনে qualifier হিসাবে কাজ করতে পারে। এটি একই টাইপের বিভিন্ন ইমপ্লিমেন্টেশনকে আলাদা করে।
- Code Readability: কাস্টম অ্যানোটেশন ব্যবহার করলে কোডের পাঠযোগ্যতা বৃদ্ধি পায় এবং ডিপেনডেন্সির সাথে কাজ করার সময় স্পষ্টতা বজায় থাকে।
- Dynamic Bindings: আপনি কাস্টম অ্যানোটেশন ব্যবহার করে বিভিন্ন অবস্থায় ডিপেনডেন্সি dynamically bind করতে পারেন।
- Custom Annotations Guice-এ খুবই শক্তিশালী এবং নমনীয় dependency management তৈরি করতে সাহায্য করে।
@BindingAnnotationঅ্যানোটেশন ব্যবহার করে qualifier annotations তৈরি করা যায়, যা একই ধরনের ডিপেনডেন্সি গুলিকে আলাদা করতে সহায়ক।- এই পদ্ধতি Guice-এ multiple implementations এর মধ্যে স্পষ্ট পার্থক্য তৈরি করে এবং এটি আরও modular এবং testable কোড লেখায় সহায়ক।
Read more