Field Injection এর ব্যবহার এবং প্রকারভেদ

Constructor এবং Field Injection - গুইস (Guice) - Java Technologies

336

Field Injection হল একটি Dependency Injection (DI) প্যাটার্ন, যেখানে নির্ভরশীলতাগুলি সরাসরি field-এ ইনজেক্ট করা হয়। Guice এ @Inject অ্যানোটেশন ব্যবহার করে নির্ভরশীলতাগুলি ক্লাসের ফিল্ডে ইনজেক্ট করা যায়। এটি constructor injection বা method injection থেকে একটি ভিন্ন পদ্ধতি, যেখানে নির্ভরশীলতাগুলি ফিল্ডগুলিতে সরাসরি অ্যাসাইন করা হয়।


Field Injection এর ব্যবহার

Field Injection এ সাধারণত ইনজেক্টেড অবজেক্টগুলি private ফিল্ড হিসেবে থাকে এবং Guice এগুলিকে reflection এর মাধ্যমে ইনজেক্ট করে। এটি একটি সহজ এবং দ্রুত DI পদ্ধতি, তবে এটি কিছু ক্ষেত্রে কম পছন্দ করা হয়, কারণ এটি encapsulation লঙ্ঘন করতে পারে এবং কোডের স্পষ্টতা হ্রাস করতে পারে।

Field Injection এর মৌলিক উদাহরণ

  1. Dependency Interface এবং Concrete Class তৈরি করা
public interface Service {
    void serve();
}

public class ServiceImpl implements Service {
    @Override
    public void serve() {
        System.out.println("Service is serving...");
    }
}
  1. Field Injection ব্যবহার করে Client ক্লাস তৈরি করা
import com.google.inject.Inject;

public class Client {
    @Inject // Field Injection
    private Service service; 

    public void doSomething() {
        service.serve(); // Service এর serve method কল হবে
    }
}

এখানে, @Inject অ্যানোটেশন ব্যবহার করে Service ইনস্ট্যান্সটি সরাসরি Client ক্লাসের ফিল্ডে ইনজেক্ট করা হচ্ছে। Guice reflection ব্যবহার করে এই ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করবে।

  1. Guice Module তৈরি করা
import com.google.inject.AbstractModule;

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Service.class).to(ServiceImpl.class); // Service Interface কে ServiceImpl Concrete Class এর সাথে bind করা হচ্ছে
    }
}
  1. Main ক্লাসে Injector ব্যবহার করে Client ইনস্ট্যান্স তৈরি করা
import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new AppModule());
        Client client = injector.getInstance(Client.class); // Field Injection এর মাধ্যমে Service ইনজেক্ট করা হবে
        client.doSomething();
    }
}

Field Injection এর প্রকারভেদ

Field Injection ব্যবহারের কিছু বিশেষ প্রকারভেদ ও কাস্টমাইজেশন রয়েছে, যেমন:

1. Basic Field Injection

  • @Inject অ্যানোটেশন ব্যবহার করে সরাসরি ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করা হয়, যেমন উপরে দেখানো হয়েছে।
  • Guice এই ফিল্ডগুলির জন্য ইনজেকশন পরিচালনা করে এবং ফিল্ডগুলি private বা protected হলেও অ্যাক্সেস করতে পারে।

2. Field Injection with Custom Annotations

  • আপনি নির্দিষ্ট ক্ষেত্রের জন্য custom annotations ব্যবহার করতে পারেন।
  • উদাহরণস্বরূপ, একাধিক ইমপ্লিমেন্টেশন থাকলে @Named অ্যানোটেশন ব্যবহার করে নির্দিষ্ট ইমপ্লিমেন্টেশন ইনজেক্ট করতে পারেন।
public class Client {
    @Inject
    @Named("Service1") // Custom Annotation (Named binding)
    private Service service;
}

এবং Module-এ @Named ব্যবহার করে binding করতে হবে:

bind(Service.class).annotatedWith(Names.named("Service1")).to(ServiceImpl.class);

3. Field Injection with Provider

  • আপনি Guice এর Provider ব্যবহার করে ডিপেনডেন্সিগুলির ইনজেকশন আরও কাস্টমাইজ করতে পারেন, যাতে আপনি নির্দিষ্ট সময়ে নির্ভরশীলতা তৈরি করতে পারেন।
import com.google.inject.Provider;

public class Client {
    @Inject
    private Provider<Service> serviceProvider; // Field Injection with Provider

    public void doSomething() {
        serviceProvider.get().serve(); // Lazy loading via Provider
    }
}

4. Field Injection with @Inject in Subclasses

  • Guice ইনজেকশন ফিল্ডগুলিতে মেনে চলে এমনকি যদি তা subclass-এ হয়। আপনি বেস ক্লাসে @Inject ব্যবহার করতে পারেন এবং এটি সাবক্লাসে ইনজেক্ট হবে।

5. Lazy Field Injection

  • Guice এর @Inject ফিল্ডে lazy injection ব্যবহারের জন্য Provider ব্যবহার করতে পারেন। এটি সেই ক্ষেত্রে কার্যকর যেখানে নির্ভরশীলতাগুলি তখনই তৈরি হবে যখন তা আসলেই প্রয়োজন।

Field Injection এর সুবিধা ও সীমাবদ্ধতা

সুবিধা:

  1. সোজা এবং সরল কোড: কোড দ্রুত লিখতে সাহায্য করে কারণ @Inject ব্যবহার করে সরাসরি ফিল্ডে ইনজেকশন করা যায়।
  2. Less Boilerplate Code: Constructor Injection এর চেয়ে কম কোড লেখা হয়।
  3. ফিল্ডগুলোতে সহজে ডিপেনডেন্সি ইনজেক্ট করা যায়: অনেক ক্ষেত্রে একাধিক ডিপেনডেন্সি থাকার ফলে Constructor Injection একটু জটিল হতে পারে, কিন্তু Field Injection তা সহজ করে।

সীমাবদ্ধতা:

  1. Encapsulation লঙ্ঘন: Field Injection সাধারণত private ফিল্ডের মধ্যে ডিপেনডেন্সি ইনজেক্ট করে, যা encapsulation লঙ্ঘন করতে পারে।
  2. Dependency Injection ক্লাসের বাইরে থেকে অস্পষ্ট: Constructor Injection এর তুলনায়, Field Injection এ নির্ভরশীলতা স্পষ্টভাবে দেখা যায় না।
  3. Testing Issue: ফিল্ড ইনজেকশন টেস্ট করা কখনও কখনও কঠিন হতে পারে, কারণ ডিপেনডেন্সিগুলি কোডের বাইরে থেকে সরাসরি ইনজেক্ট করা হয় এবং এটি সহজে mock করা কঠিন।

Field Injection হল Guice-এ Dependency Injection এর একটি সহজ এবং দ্রুত পদ্ধতি, তবে এটি কিছু ক্ষেত্রে কম পছন্দ করা হয়, যেমন encapsulation লঙ্ঘনের কারণে। তবুও, যদি আপনি কোড দ্রুত লেখার জন্য একটি সরল পদ্ধতি চান, তবে Field Injection উপযুক্ত হতে পারে। তবে বড় এবং জটিল অ্যাপ্লিকেশনগুলিতে, Constructor Injection সাধারণত বেশি পছন্দ করা হয় কারণ এটি কোডের স্পষ্টতা এবং টেস্টেবিলিটি উন্নত করে।

Content added By
Promotion

Are you sure to start over?

Loading...