Custom Annotation এর মাধ্যমে Binding তৈরি করা

Guice এবং Custom Annotations - গুইস (Guice) - Java Technologies

254

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 কোড লেখায় সহায়ক।
Content added By
Promotion

Are you sure to start over?

Loading...