Guice Dependency Injection (DI) ফ্রেমওয়ার্কে @Inject এবং @Named অ্যানোটেশন দুটি গুরুত্বপূর্ণ ভূমিকা পালন করে। এই অ্যানোটেশনগুলি নির্ভরশীলতাগুলি ইনজেক্ট করতে সাহায্য করে এবং কোডের আরও নমনীয়তা (flexibility) প্রদান করে।
@Inject এর ব্যবহার
@Inject অ্যানোটেশন Guice এর মাধ্যমে ডিপেনডেন্সি ইনজেকশন করার জন্য ব্যবহৃত হয়। এটি constructor, method, অথবা field-এ ইনজেকশন বাস্তবায়ন করতে পারে। যখন আপনি @Inject ব্যবহার করেন, Guice স্বয়ংক্রিয়ভাবে নির্ভরশীলতার ইনস্ট্যান্স তৈরি করে এবং তা সরবরাহ করে।
Constructor Injection এর মাধ্যমে @Inject এর ব্যবহার
import com.google.inject.Inject;
public class Client {
private final Service service;
// @Inject অ্যানোটেশন দিয়ে constructor-এ ডিপেনডেন্সি ইনজেক্ট করা হচ্ছে
@Inject
public Client(Service service) {
this.service = service;
}
public void doSomething() {
service.serve();
}
}
এখানে, @Inject অ্যানোটেশনটি Guice-কে বলে যে Service ইনস্ট্যান্সটি Client ক্লাসের কনস্ট্রাক্টরে ইনজেক্ট করতে হবে।
Field Injection এর মাধ্যমে @Inject এর ব্যবহার
import com.google.inject.Inject;
public class Client {
@Inject
private Service service; // @Inject এর মাধ্যমে ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করা হচ্ছে
public void doSomething() {
service.serve();
}
}
এখানে, @Inject ব্যবহার করা হয়েছে ফিল্ডে, যেটি Guice-কে বলে যে service ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করতে হবে।
@Named এর ব্যবহার
@Named অ্যানোটেশন Guice-এর named binding সুবিধা প্রদান করে। এটি বিভিন্ন ইমপ্লিমেন্টেশন বা ইনস্ট্যান্সের মধ্যে ডিপেনডেন্সি নির্বাচন করার জন্য ব্যবহার করা হয়। @Named নামক অ্যানোটেশনটি ব্যবহার করে আপনি একাধিক ইমপ্লিমেন্টেশন বা ভিন্ন কনফিগারেশন ডিপেনডেন্সি ইনজেক্ট করতে পারেন। এটি যখন আপনার কাছে একাধিক সম্ভাব্য ইমপ্লিমেন্টেশন থাকে, তখন আপনি নির্দিষ্ট একটি ইমপ্লিমেন্টেশন নির্বাচন করতে পারবেন।
@Named এর মাধ্যমে Named Binding
ধরা যাক, আপনার কাছে Service ইন্টারফেসের দুটি আলাদা ইমপ্লিমেন্টেশন রয়েছে, এবং আপনি প্রতিটির জন্য আলাদা নাম ব্যবহার করতে চান।
public interface Service {
void serve();
}
public class ServiceImpl1 implements Service {
@Override
public void serve() {
System.out.println("Service 1 is serving...");
}
}
public class ServiceImpl2 implements Service {
@Override
public void serve() {
System.out.println("Service 2 is serving...");
}
}
এখন, @Named অ্যানোটেশন ব্যবহার করে এই দুটি ইমপ্লিমেন্টেশনকে আলাদা করে bind করা যাবে।
Guice Module এ Named Binding
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
public class AppModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).annotatedWith(Names.named("Service1")).to(ServiceImpl1.class);
bind(Service.class).annotatedWith(Names.named("Service2")).to(ServiceImpl2.class);
}
}
এখানে, Service ইন্টারফেসের দুটি ইমপ্লিমেন্টেশনকে দুটি আলাদা নাম দেওয়া হয়েছে, Service1 এবং Service2। এখন আপনি @Named ব্যবহার করে নির্দিষ্ট করে একটি ইমপ্লিমেন্টেশন ইনজেক্ট করতে পারবেন।
@Named এর মাধ্যমে Dependency Injection
import com.google.inject.Inject;
import com.google.inject.name.Named;
public class Client {
private final Service service;
// @Named এর মাধ্যমে নির্দিষ্ট ইমপ্লিমেন্টেশন ইনজেক্ট করা হচ্ছে
@Inject
public Client(@Named("Service1") Service service) {
this.service = service;
}
public void doSomething() {
service.serve(); // এটি ServiceImpl1 এর serve method কল করবে
}
}
এখানে, @Named("Service1") ব্যবহার করে ServiceImpl1 কে নির্দিষ্টভাবে ইনজেক্ট করা হয়েছে। একইভাবে, যদি আপনি @Named("Service2") ব্যবহার করেন, তবে ServiceImpl2 ইনজেক্ট হবে।
@Inject এবং @Named একসাথে ব্যবহার
যখন আপনি একাধিক ইমপ্লিমেন্টেশন বা ডিপেনডেন্সি প্রদান করতে চান, তখন আপনি @Inject এবং @Named অ্যানোটেশন দুটি একসাথে ব্যবহার করতে পারেন।
উদাহরণ: @Inject এবং @Named একসাথে ব্যবহার
import com.google.inject.Inject;
import com.google.inject.name.Named;
public class Client {
private final Service service1;
private final Service service2;
@Inject
public Client(@Named("Service1") Service service1, @Named("Service2") Service service2) {
this.service1 = service1;
this.service2 = service2;
}
public void doSomething() {
service1.serve(); // ServiceImpl1
service2.serve(); // ServiceImpl2
}
}
এখানে, @Named ব্যবহার করে Service1 এবং Service2 ইমপ্লিমেন্টেশন দুটি আলাদা করে ইনজেক্ট করা হয়েছে।
- @Inject: Guice-এ ডিপেনডেন্সি ইনজেকশন করতে ব্যবহৃত হয়। এটি constructor, method বা field-এ ইনজেকশন করতে সাহায্য করে। এটি মূলত Guice এর Dependency Injection মেকানিজমের প্রধান অ্যানোটেশন।
- @Named: একাধিক ইমপ্লিমেন্টেশন থাকলে, এটি নির্দিষ্টভাবে কোন ইমপ্লিমেন্টেশন ইনজেক্ট করতে ব্যবহৃত হয়। এটি বিভিন্ন ডিপেনডেন্সি একে অপরের থেকে আলাদা করে ইনজেক্ট করার সুবিধা প্রদান করে।
উপরের দুটি অ্যানোটেশন ব্যবহার করে আপনি flexibility এবং loose coupling নিশ্চিত করতে পারবেন, যা বড় এবং জটিল অ্যাপ্লিকেশনগুলিতে সুবিধাজনক।
Read more