Guice (গুইস) ফ্রেমওয়ার্কে এক বা একাধিক Implementation এর জন্য Custom Annotations ব্যবহার করা একটি শক্তিশালী পদ্ধতি। এটি আপনাকে Dependency Injection (DI) কনফিগারেশনকে আরো কাস্টমাইজ এবং নির্দিষ্ট করতে সাহায্য করে। যখন আপনার কাছে একাধিক ইমপ্লিমেন্টেশন থাকে এবং আপনি নির্দিষ্ট কাজের জন্য একটি নির্দিষ্ট ইমপ্লিমেন্টেশন ব্যবহার করতে চান, তখন Custom Annotations খুবই কার্যকর।
Custom Annotations এর প্রয়োজনীয়তা:
কখনও কখনও আপনার কাছে একাধিক Implementation থাকতে পারে যা একই ইন্টারফেস বা সুপার ক্লাস ইমপ্লিমেন্ট করে। সাধারণভাবে, Guice bind() এর মাধ্যমে একটি একক ইমপ্লিমেন্টেশন ব্যবহার করে, কিন্তু আপনি যদি নির্দিষ্ট পরিস্থিতিতে ভিন্ন ইমপ্লিমেন্টেশন ব্যবহার করতে চান, তাহলে Custom Annotations আপনার কাজ সহজ করে।
Custom Annotations এর ব্যবহার:
গুইসে Custom Annotations ব্যবহার করার জন্য, আপনাকে তিনটি মূল স্টেপ অনুসরণ করতে হবে:
- Custom Annotation তৈরি করা।
- Guice Module এ Annotation ব্যবহার করে Binding করা।
- Injection-এ Custom Annotation ব্যবহার করা।
স্টেপ 1: Custom Annotation তৈরি করা
প্রথমে একটি কাস্টম অ্যানোটেশন তৈরি করতে হবে, যা আপনাকে বিভিন্ন ইমপ্লিমেন্টেশন চিহ্নিত করতে সহায়ক হবে।
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import com.google.inject.BindingAnnotation;
@Retention(RetentionPolicy.RUNTIME)
@BindingAnnotation
public @interface CreditCardPayment {
// Custom annotation for CreditCard payment
}
এই অ্যানোটেশনটি @CreditCardPayment নামে একটি কাস্টম অ্যানোটেশন তৈরি করবে যা BindingAnnotation হিসেবে চিহ্নিত হবে।
স্টেপ 2: Guice Module এ Annotation ব্যবহার করে Binding করা
এখন, আপনি Guice মডিউল তৈরি করবেন যেখানে একাধিক PaymentService ইমপ্লিমেন্টেশনকে কাস্টম অ্যানোটেশন দিয়ে bind করবেন।
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
public class PaymentModule extends AbstractModule {
@Override
protected void configure() {
// Binding CreditCardPaymentService with a custom annotation
bind(PaymentService.class)
.annotatedWith(CreditCardPayment.class)
.to(CreditCardPaymentService.class);
// Binding PayPalPaymentService without annotation
bind(PaymentService.class)
.to(PayPalPaymentService.class);
}
}
এখানে, CreditCardPaymentService ক্লাসটি কাস্টম অ্যানোটেশন @CreditCardPayment ব্যবহার করে বাইন্ড করা হয়েছে। অন্যদিকে, PayPalPaymentService বাইন্ডিং সাধারণভাবে করা হয়েছে।
স্টেপ 3: Injection-এ Custom Annotation ব্যবহার করা
এখন, আপনি যেখানে PaymentService ইনজেক্ট করতে চান, সেখানে কাস্টম অ্যানোটেশন ব্যবহার করবেন।
import com.google.inject.Inject;
public class OrderService {
private final PaymentService paymentService;
// Injecting PaymentService with CreditCardPayment annotation
@Inject
public OrderService(@CreditCardPayment PaymentService paymentService) {
this.paymentService = paymentService;
}
public void placeOrder(String amount) {
System.out.println("Placing order...");
paymentService.processPayment(amount);
}
}
এখানে, OrderService ক্লাসের কন্সট্রাক্টরটি CreditCardPayment অ্যানোটেশন দিয়ে সজ্জিত হয়েছে, যা PaymentService এর নির্দিষ্ট ইমপ্লিমেন্টেশন (CreditCardPaymentService) ইনজেক্ট করবে।
বাকি কোড (Main Method)
এখন Injector তৈরি করে এবং ইনজেক্টেড ক্লাস ব্যবহার করে অ্যাপ্লিকেশন চালাতে হবে।
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Application {
public static void main(String[] args) {
// Create Injector with PaymentModule configuration
Injector injector = Guice.createInjector(new PaymentModule());
// Get an instance of OrderService
OrderService orderService = injector.getInstance(OrderService.class);
// Place an order
orderService.placeOrder("100 USD");
}
}
সম্পূর্ণ কোড ব্যাখ্যা:
- Custom Annotation:
@CreditCardPaymentঅ্যানোটেশনটি BindingAnnotation হিসেবে চিহ্নিত, যা Guice এর বাইন্ডিং সিস্টেমকে নির্দেশ দেয় কোন ইমপ্লিমেন্টেশনটি কীভাবে ইনজেক্ট হবে। - Guice Module:
PaymentModuleক্লাসে বিভিন্ন PaymentService ইমপ্লিমেন্টেশন বাইন্ড করা হয়েছে।CreditCardPaymentService-কে কাস্টম অ্যানোটেশন দিয়ে বাইন্ড করা হয়েছে, অন্যদিকেPayPalPaymentServiceসাধারণভাবে বাইন্ড করা হয়েছে। - Injection with Custom Annotation:
OrderServiceক্লাসে কন্সট্রাক্টরের মাধ্যমে @CreditCardPayment অ্যানোটেশন ব্যবহার করে সঠিক ইমপ্লিমেন্টেশন ইনজেক্ট করা হয়েছে।
Custom Annotations এর সুবিধা:
- নির্দিষ্ট ইমপ্লিমেন্টেশন নির্বাচন: একাধিক ইমপ্লিমেন্টেশন থাকা সত্ত্বেও কাস্টম অ্যানোটেশন ব্যবহার করে নির্দিষ্ট ইমপ্লিমেন্টেশন নির্বাচন করা সহজ হয়।
- বহু বাইন্ডিং নিয়ন্ত্রণ: আপনি একাধিক ইমপ্লিমেন্টেশন সংজ্ঞায়িত করতে পারেন এবং অ্যানোটেশনের মাধ্যমে নির্দিষ্ট ক্লাসে ইনজেক্ট করতে পারেন।
- কোডের পরিষ্কারতা এবং সম্প্রসারণযোগ্যতা: কাস্টম অ্যানোটেশন ব্যবহার করার মাধ্যমে কোডের পরিচ্ছন্নতা বজায় থাকে এবং ভবিষ্যতে অন্যান্য ইমপ্লিমেন্টেশন যোগ করা সহজ হয়।
- নিরাপত্তা: নির্দিষ্ট ডিপেন্ডেন্সি সরবরাহ নিশ্চিত করার জন্য অ্যানোটেশন ব্যবহার করা হয়, যা ভুল ইনজেকশন এড়াতে সাহায্য করে।
Guice-এ Custom Annotations ব্যবহার করে আপনি একাধিক ইমপ্লিমেন্টেশনের মধ্যে সঠিকটি নির্বাচন করতে পারেন, যা আপনার কোডকে আরও মডুলার, পরিষ্কার এবং টেস্টযোগ্য করে তোলে। এই পদ্ধতি বড় এবং জটিল অ্যাপ্লিকেশনগুলির জন্য খুবই কার্যকর।
Read more