Guice (গুইস) ফ্রেমওয়ার্কে Standard Dependency Injection (DI) Annotations ব্যবহার করার মাধ্যমে ডিপেন্ডেন্সি ইনজেকশন আরও সহজ, পরিষ্কার এবং কার্যকরী করা যায়। Guice @Inject অ্যানোটেশন সরাসরি ব্যবহারের মাধ্যমে ডিপেন্ডেন্সি ইনজেকশন পরিচালনা করে। এটি Guice-এর সবচেয়ে সাধারণ এবং সহজ পদ্ধতি, যা ডিপেন্ডেন্সি ম্যানেজমেন্টকে আরও সরল ও সুসংগঠিত করে।
এখানে Guice-এ Standard DI Annotations ব্যবহারের বিভিন্ন পদ্ধতি আলোচনা করা হলো।
Standard DI Annotations:
Guice দুটি গুরুত্বপূর্ণ Standard DI Annotation প্রদান করে:
@Inject@Named
1. @Inject Annotation
@Inject অ্যানোটেশন Guice-এর প্রধান অ্যানোটেশন, যা ডিপেন্ডেন্সি ইনজেকশনকে সহজ এবং সরাসরি করে তোলে। এটি সাধারণত কন্সট্রাক্টর, ফিল্ড বা মেথডে ব্যবহার করা হয়।
@Inject এর ব্যবহারের উদাহরণ:
কন্সট্রাক্টর ইনজেকশন:
এখানে কন্সট্রাক্টরের মাধ্যমে ডিপেন্ডেন্সি ইনজেক্ট করা হয়েছে:
public interface PaymentService { void processPayment(String amount); } public class CreditCardPaymentService implements PaymentService { @Inject public CreditCardPaymentService() { // Constructor Injection (Guice will automatically inject dependencies) } @Override public void processPayment(String amount) { System.out.println("Processing payment of " + amount + " via Credit Card."); } } public class PaymentModule extends AbstractModule { @Override protected void configure() { bind(PaymentService.class).to(CreditCardPaymentService.class); } } public class Application { public static void main(String[] args) { Injector injector = Guice.createInjector(new PaymentModule()); PaymentService paymentService = injector.getInstance(PaymentService.class); paymentService.processPayment("100 USD"); } }
এখানে CreditCardPaymentService ক্লাসে কন্সট্রাক্টর @Inject অ্যানোটেশন দিয়ে ডিপেন্ডেন্সি ইনজেক্ট করা হয়েছে।
ফিল্ড ইনজেকশন:
এখানে একটি ফিল্ডের মাধ্যমে ডিপেন্ডেন্সি ইনজেক্ট করা হয়েছে:
public class PaymentService { @Inject private PaymentProcessor paymentProcessor; // Field Injection public void processPayment(String amount) { paymentProcessor.processPayment(amount); } } public class PaymentProcessor { public void processPayment(String amount) { System.out.println("Processing payment of " + amount); } }
এখানে PaymentService ক্লাসের মধ্যে paymentProcessor ফিল্ডে ডিপেন্ডেন্সি ইনজেক্ট করা হয়েছে, যেটি @Inject দ্বারা চিহ্নিত করা হয়েছে।
মেথড ইনজেকশন:
আপনি @Inject অ্যানোটেশন মেথডে ব্যবহার করে ডিপেন্ডেন্সি ইনজেক্ট করতে পারেন।
public class OrderService { private PaymentService paymentService; @Inject public void setPaymentService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder(String amount) { paymentService.processPayment(amount); } }
এখানে OrderService ক্লাসে setPaymentService মেথডের মাধ্যমে PaymentService ইনজেক্ট করা হয়েছে।
2. @Named Annotation
@Named অ্যানোটেশন Guice এর DI কনফিগারেশনে আপনাকে নির্দিষ্ট নাম বা পরিচিতি প্রদান করে, যাতে একাধিক ইমপ্লিমেন্টেশন ব্যবহার করার সময় নির্দিষ্ট ইমপ্লিমেন্টেশনটি চিহ্নিত করা যায়। যখন আপনার একাধিক ইমপ্লিমেন্টেশন থাকে এবং আপনি নির্দিষ্ট একটি ইমপ্লিমেন্টেশন ব্যবহার করতে চান, তখন @Named অ্যানোটেশন ব্যবহার করা হয়।
@Named এর ব্যবহারের উদাহরণ:
import com.google.inject.Inject;
import com.google.inject.name.Named;
public interface PaymentService {
void processPayment(String amount);
}
public class CreditCardPaymentService implements PaymentService {
@Override
public void processPayment(String amount) {
System.out.println("Processing payment of " + amount + " via Credit Card.");
}
}
public class PayPalPaymentService implements PaymentService {
@Override
public void processPayment(String amount) {
System.out.println("Processing payment of " + amount + " via PayPal.");
}
}
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
public class PaymentModule extends AbstractModule {
@Override
protected void configure() {
bind(PaymentService.class)
.annotatedWith(Names.named("CreditCard"))
.to(CreditCardPaymentService.class);
bind(PaymentService.class)
.annotatedWith(Names.named("PayPal"))
.to(PayPalPaymentService.class);
}
}
public class Application {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new PaymentModule());
// Inject specific implementation using the Named annotation
PaymentService paymentService = injector.getInstance(Key.get(PaymentService.class, Names.named("CreditCard")));
paymentService.processPayment("200 USD");
}
}
এখানে, @Named("CreditCard") এবং @Named("PayPal") ব্যবহার করে Guice-এ দুটি ভিন্ন ইমপ্লিমেন্টেশন বাইন্ড করা হয়েছে এবং নির্দিষ্ট নাম দিয়ে ইমপ্লিমেন্টেশন চিহ্নিত করা হয়েছে।
Standard DI Annotations এর সুবিধা:
- সহজ এবং পরিষ্কার কোড:
@Injectঅ্যানোটেশন কোডে ডিপেন্ডেন্সি ইনজেকশনকে সহজ করে দেয়। এটি নির্দিষ্ট জায়গায় ডিপেন্ডেন্সি ইনজেক্ট করার জন্য একটি পরিষ্কার এবং সোজা উপায়। - কমপ্লেক্স কনফিগারেশন থেকে মুক্তি: আপনাকে আর ডিপেন্ডেন্সি ইনজেকশন ম্যানুয়ালি কনফিগার করতে হবে না।
@Injectঅ্যানোটেশন ডিপেন্ডেন্সি ইনজেকশন স্বয়ংক্রিয়ভাবে করবে। - নামভিত্তিক বাইন্ডিং:
@Namedঅ্যানোটেশন একাধিক ইমপ্লিমেন্টেশনের মধ্যে সুনির্দিষ্ট ইমপ্লিমেন্টেশন চিহ্নিত করতে সহায়তা করে। - কোড পুনঃব্যবহারযোগ্যতা: একবার কন্সট্রাক্টর বা ফিল্ড ইনজেকশন করা হলে সেই ডিপেন্ডেন্সি টেস্টিং, রক্ষণাবেক্ষণ এবং পুনঃব্যবহারের জন্য সহজ হয়ে যায়।
- Testability: Guice DI ব্যবহারের ফলে কোডের testability বৃদ্ধি পায়, কারণ আপনি নির্দিষ্ট ডিপেন্ডেন্সি সহজেই মক বা মডিফাই করতে পারেন।
Guice-এ Standard DI Annotations ব্যবহারের মাধ্যমে আপনি আপনার Java অ্যাপ্লিকেশনকে আরও পরিষ্কার, মডুলার এবং সহজেই টেস্টযোগ্য করতে পারেন। @Inject এবং @Named অ্যানোটেশনগুলির মাধ্যমে ডিপেন্ডেন্সি ইনজেকশন পরিচালনা করা সহজ এবং কার্যকর হয়। এটি কোডের ডিপেন্ডেন্সি ম্যানেজমেন্টকে সুসংগঠিত করে এবং কোডের মান বজায় রাখতে সাহায্য করে।
Read more