Guice এর Provider Interface হল একটি বিশেষ ইন্টারফেস যা একটি ডিপেনডেন্সি বা অবজেক্ট প্রদান করার জন্য ব্যবহৃত হয়, তবে এটি তখনই তৈরি করবে যখন তা প্রয়োজন হবে। Guice এর Provider Interface আপনাকে লেজি লোডিং বা ডেলেইড ইনস্ট্যান্স ক্রিয়েশন করতে সাহায্য করে, অর্থাৎ অবজেক্ট তখনই তৈরি হবে যখন তা বাস্তবে প্রয়োজন হবে। এটি আপনার কোডে ডিপেনডেন্সি ইনজেকশনকে আরও বেশি কনট্রোল এবং ফ্লেক্সিবিলিটি প্রদান করে।
Guice এর Provider Interface কী?
Guice এর Provider হল একটি সাধারণ Java Interface যা get() মেথড ডিফাইন করে। get() মেথডটি একটি নির্দিষ্ট অবজেক্ট প্রদান করে, এবং এই অবজেক্টটি তখনই তৈরি হয় যখন get() কল করা হয়।
Provider<T> Interface
import com.google.inject.Provider;
public interface Provider<T> {
T get();
}
Provider ইন্টারফেসটি Guice কে জানায় যে, যখনই এই প্রকারের ডিপেনডেন্সি প্রয়োজন হবে, তখন এটি প্রস্তুত হয়ে যাবে।
Provider Interface ব্যবহার করার সুবিধা
- লেজি লোডিং (Lazy Loading):
Providerব্যবহার করার মাধ্যমে আপনি ডিপেনডেন্সি সৃষ্টির সময়টি পেছনে ঠেলে দিতে পারেন। অবজেক্টটি তখনই তৈরি হবে যখন তা প্রকৃতপক্ষে প্রয়োজন।
- ডিপেনডেন্সি ইনস্ট্যান্স নিয়ন্ত্রণ:
Providerআপনাকে ডিপেনডেন্সি তৈরির প্রক্রিয়া কাস্টমাইজ করতে সাহায্য করে। আপনি তখনই ডিপেনডেন্সি তৈরি করতে পারেন যখন এটি বাস্তবে প্রয়োজন, এবং আপনার কোডে একাধিক ইনস্ট্যান্স তৈরি করার থেকে বিরত থাকতে পারেন।
- ডাইনামিক ইনস্ট্যান্স ক্রিয়েশন:
Providerব্যবহার করলে আপনি একই প্রকারের ডিপেনডেন্সির বিভিন্ন ভ্যারিয়েন্ট ইনস্ট্যান্স তৈরি করতে পারেন, কারণProviderগুলি অবজেক্ট তৈরির সময় এবং কনফিগারেশনের ওপর আরও বেশি নিয়ন্ত্রণ দেয়।
Guice এর Provider Interface এর উদাহরণ
Step 1: Provider ব্যবহার করা
ধরা যাক, আপনার একটি Service ইন্টারফেস এবং এর একটি ServiceImpl ইমপ্লিমেন্টেশন আছে। আপনি যদি Provider ব্যবহার করতে চান, তাহলে আপনাকে Provider ব্যবহার করে একটি lazy-loaded ইনস্ট্যান্স তৈরি করতে হবে।
Service Interface এবং Implementation
public interface Service {
void performTask();
}
public class ServiceImpl implements Service {
public ServiceImpl() {
System.out.println("ServiceImpl Created!");
}
@Override
public void performTask() {
System.out.println("Task performed by ServiceImpl.");
}
}
Step 2: Provider এর সাহায্যে ডিপেনডেন্সি ইনজেকশন
এখন, আপনি Guice এর Provider ব্যবহার করে ServiceImpl ইনস্ট্যান্স তৈরি করবেন। Lazy Loading নিশ্চিত করার জন্য Guice এর Provider ব্যবহার করা হবে।
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
// Service এর জন্য Provider ব্যবহার করা
bind(Service.class).toProvider(ServiceProvider.class);
}
}
class ServiceProvider implements Provider<Service> {
@Override
public Service get() {
// ServiceImpl ইনস্ট্যান্স তৈরি করা
return new ServiceImpl();
}
}
Step 3: Injector ব্যবহার করে Provider এর মাধ্যমে ইনস্ট্যান্স রেজোলভ করা
import com.google.inject.Guice;
import com.google.inject.Injector;
public class MainApp {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new AppModule());
// Provider ব্যবহার করে Service রেজোলভ করা
Provider<Service> serviceProvider = injector.getProvider(Service.class);
// Service এর ইনস্ট্যান্স প্রথমবার যখন প্রয়োজন তখনই তৈরি হবে
Service service = serviceProvider.get();
service.performTask(); // Output: Task performed by ServiceImpl.
// আবার একই Service instance তৈরি হবে না
Service anotherService = serviceProvider.get();
anotherService.performTask(); // Output: Task performed by ServiceImpl.
}
}
আউটপুট
ServiceImpl Created!
Task performed by ServiceImpl.
Task performed by ServiceImpl.
এখানে, আপনি দেখতে পাবেন যে প্রথমবার যখন serviceProvider.get() কল করা হয়, তখনই ServiceImpl ইনস্ট্যান্স তৈরি হবে। দ্বিতীয়বার get() কল করার পরেও, নতুন কোন ইনস্ট্যান্স তৈরি হয়নি, কারণ Provider শুধুমাত্র একবার ইনস্ট্যান্স তৈরি করবে এবং পরে তা পুনঃব্যবহার করবে।
Provider Interface এর ব্যবহারিক গুরুত্ব
- Lazy Initialization:
Providerদিয়ে আপনি ডিপেনডেন্সি তৈরি করার কাজ পিছিয়ে রাখতে পারেন, অর্থাৎ অবজেক্টটি তখনই তৈরি হবে যখন তা বাস্তবে প্রয়োজন হবে।
- Multiple Instances:
- যখন আপনি একাধিক ইনস্ট্যান্স তৈরি করতে চান, তখন
Providerএর মাধ্যমে এটি সহজে করা যায়। উদাহরণস্বরূপ, আপনার যদি নির্দিষ্ট সময়ের মধ্যে একাধিক ভিন্ন কনফিগারেশন অবজেক্ট প্রয়োজন হয়, তাহলেProviderব্যবহার করে এটি সম্ভব।
- যখন আপনি একাধিক ইনস্ট্যান্স তৈরি করতে চান, তখন
- Circular Dependencies:
- কিছু ক্ষেত্রে ডিপেনডেন্সি একে অপরের মধ্যে Circular হতে পারে।
Providerব্যবহারের মাধ্যমে আপনি একে অপরের উপর নির্ভরশীল অবজেক্টগুলো তৈরি করতে পারেন, যাতে Guice সঠিকভাবে তাদের ইনজেক্ট করতে পারে।
- কিছু ক্ষেত্রে ডিপেনডেন্সি একে অপরের মধ্যে Circular হতে পারে।
- Testing:
Providerব্যবহার করলে আপনার কোড টেস্টিং আরও সহজ হয়, কারণ আপনি ডিপেনডেন্সি সরবরাহকারীProviderএর মাধ্যমে মক অবজেক্ট প্রদান করতে পারেন।
Guice এর Provider Interface হল একটি শক্তিশালী টুল যা আপনাকে ডিপেনডেন্সি সৃষ্টির প্রক্রিয়া কাস্টমাইজ এবং নিয়ন্ত্রণ করতে সাহায্য করে। এটি lazy loading, multiple instances, circular dependencies এবং testability সহ আরও অনেক সুবিধা প্রদান করে, যা ডিপেনডেন্সি ইনজেকশনে আরও উন্নত মানের এবং মডুলার কোড তৈরি করতে সাহায্য করে।
Read more