Constructor Injection এবং Setter Injection হল Dependency Injection (DI) প্যাটার্নের দুটি প্রধান উপায়, যা সাধারণত Spring Framework বা অন্যান্য Inversion of Control (IoC) কন্টেইনারে ব্যবহৃত হয়। Dependency Injection হল একটি ডিজাইন প্যাটার্ন যা একটি ক্লাসের নির্ভরশীলতা (dependencies) বাইরের উৎস (অন্য ক্লাস বা ফ্যাক্টরি) দ্বারা সরবরাহ করে। এতে কোডে loose coupling তৈরি হয়, কারণ একটি ক্লাস তার নির্ভরশীলতাগুলি নিজে তৈরি না করে বাহ্যিকভাবে পায়।
Constructor Injection এবং Setter Injection হল Dependency Injection এর দুটি জনপ্রিয় পদ্ধতি:
1. Constructor Injection
Constructor Injection এ ক্লাসের কনস্ট্রাক্টর ব্যবহার করে নির্ভরশীলতা ইনজেক্ট করা হয়। যখন একটি অবজেক্ট তৈরি করা হয়, তখন কনস্ট্রাক্টর প্যারামিটার হিসেবে নির্ভরশীলতা প্রদান করা হয়। এই পদ্ধতির সুবিধা হল যে, ক্লাসের নির্ভরশীলতাগুলি কনস্ট্রাক্টর ইনজেকশন দ্বারা বাধ্যতামূলকভাবে সেট করা হয়, অর্থাৎ অবজেক্টটি তৈরি হওয়ার সময় সমস্ত নির্ভরশীলতা পূর্ণ হবে।
1.1. Constructor Injection Example in Java
// Dependency
class Engine {
public void start() {
System.out.println("Engine started.");
}
}
// Client class which depends on Engine
class Car {
private Engine engine;
// Constructor Injection
public Car(Engine engine) {
this.engine = engine;
}
public void startCar() {
engine.start();
System.out.println("Car started.");
}
}
// Main class to test Constructor Injection
public class ConstructorInjectionExample {
public static void main(String[] args) {
// Creating the Engine object
Engine engine = new Engine();
// Injecting Engine dependency via Constructor Injection
Car car = new Car(engine);
// Starting the car
car.startCar();
}
}
ব্যাখ্যা:
- Engine ক্লাস হল আমাদের নির্ভরশীলতা।
- Car ক্লাসে
Engineএর উপর নির্ভরশীলতা রয়েছে এবং এটি কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়। - Car ক্লাসে engine.start() মেথড কল করে গাড়ি চালু করা হয়।
- কনস্ট্রাক্টর ইনজেকশন ব্যবহৃত হয়েছে, যাতে কনস্ট্রাক্টর প্যারামিটার হিসেবে Engine নির্ভরশীলতা সরবরাহ করা হয়।
আউটপুট:
Engine started.
Car started.
2. Setter Injection
Setter Injection এ নির্ভরশীলতা ক্লাসের setter methods ব্যবহার করে ইনজেক্ট করা হয়। এই পদ্ধতিতে, ক্লাসের কনস্ট্রাকটরটি ডিফল্ট বা একটি প্রাথমিক অবস্থা গ্রহণ করতে পারে এবং নির্ভরশীলতা পরে setter methods ব্যবহার করে সেট করা হয়।
2.1. Setter Injection Example in Java
// Dependency
class Engine {
public void start() {
System.out.println("Engine started.");
}
}
// Client class which depends on Engine
class Car {
private Engine engine;
// Default constructor
public Car() {}
// Setter Injection
public void setEngine(Engine engine) {
this.engine = engine;
}
public void startCar() {
engine.start();
System.out.println("Car started.");
}
}
// Main class to test Setter Injection
public class SetterInjectionExample {
public static void main(String[] args) {
// Creating the Engine object
Engine engine = new Engine();
// Creating the Car object
Car car = new Car();
// Injecting Engine dependency via Setter Injection
car.setEngine(engine);
// Starting the car
car.startCar();
}
}
ব্যাখ্যা:
- Engine ক্লাস আবার নির্ভরশীলতা হিসেবে কাজ করছে।
- Car ক্লাসে setEngine() মেথডের মাধ্যমে Engine ইনজেক্ট করা হয়েছে।
- এখানে কনস্ট্রাক্টরটি ডিফল্ট, এবং নির্ভরশীলতা পরে সেট করা হচ্ছে।
আউটপুট:
Engine started.
Car started.
3. Constructor Injection vs Setter Injection
| Feature | Constructor Injection | Setter Injection |
|---|---|---|
| Initialization | নির্ভরশীলতাগুলি কনস্ট্রাক্টর দ্বারা বাধ্যতামূলকভাবে ইনজেক্ট করা হয়। | নির্ভরশীলতাগুলি পরে setter method দ্বারা ইনজেক্ট করা হয়। |
| Mandatory Dependencies | সমস্ত নির্ভরশীলতা তৈরি হওয়ার সময় প্রদান করতে হয়। | নির্ভরশীলতা اختياري, এবং পরবর্তীতে সেট করা যায়। |
| Immutable Objects | এটি অবজেক্টটিকে immutable করতে সাহায্য করে। | এটি অবজেক্টের অবস্থার পরিবর্তনকে অনুমতি দেয়। |
| Flexibility | নির্ভরশীলতা fixed থাকে, এবং পরে পরিবর্তন করা কঠিন। | এটি ফ্লেক্সিবল, পরে নির্ভরশীলতা পরিবর্তন করা যায়। |
| Usage | সাধারণত যেখানে নির্ভরশীলতা অপরিহার্য। | সাধারণত যেখানে নির্ভরশীলতা ঐচ্ছিক বা পরে নির্ধারিত হয়। |
| Testing | এটি পরীক্ষা করার জন্য সুবিধাজনক, কারণ সব নির্ভরশীলতা কনস্ট্রাক্টরের মাধ্যমে সরবরাহ করা হয়। | এটি কিছুটা বেশি নমনীয়, তবে নিশ্চিত করা কঠিন। |
4. When to Use Constructor Injection and Setter Injection
- Constructor Injection ব্যবহার করুন:
- যখন নির্ভরশীলতাগুলি অপরিহার্য এবং immutable থাকতে হবে।
- যখন আপনি নিশ্চিত করতে চান যে, অবজেক্টটি শুধুমাত্র পূর্ণ (valid) অবস্থায় তৈরি হবে।
- যখন সমস্ত নির্ভরশীলতা অবজেক্ট তৈরির সময় নির্দিষ্ট করতে চান।
- Setter Injection ব্যবহার করুন:
- যখন নির্ভরশীলতাগুলি ঐচ্ছিক বা সময়ে সময়ে সেট করা যেতে পারে।
- যখন ক্লাসের default state নির্ধারণ করা যায় এবং পরে নির্ভরশীলতা সেট করা যেতে পারে।
- যখন পরীক্ষার জন্য সহজে ডিপেন্ডেন্সি পরিবর্তন করতে চান।
5. Dependency Injection এবং Spring Framework
Spring Framework এ Dependency Injection (DI) একটি কেন্দ্রীয় ধারণা এবং এটি Constructor Injection এবং Setter Injection উভয়ের জন্য সমর্থন প্রদান করে। Spring তে আপনি XML Configuration, Annotation-based Configuration, এবং Java-based Configuration এর মাধ্যমে DI ব্যবহার করতে পারেন।
- Constructor Injection Spring-এ সহজেই @Autowired annotation দিয়ে ব্যবহার করা যেতে পারে, যা কনস্ট্রাক্টরের মাধ্যমে নির্ভরশীলতা ইনজেক্ট করে।
- Setter Injection Spring-এ @Autowired annotation দিয়ে setter methods এর মাধ্যমে নির্ভরশীলতা ইনজেক্ট করতে ব্যবহৃত হয়।
সারাংশ
Constructor Injection এবং Setter Injection হল Dependency Injection (DI) প্যাটার্নের দুটি গুরুত্বপূর্ণ পদ্ধতি, যেখানে Constructor Injection সমস্ত নির্ভরশীলতা কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করে এবং Setter Injection নির্ভরশীলতাগুলি পরে setter methods এর মাধ্যমে ইনজেক্ট করে।
- Constructor Injection ক্লাসের নির্ভরশীলতাগুলিকে অপরিহার্য এবং পরিবর্তনশীল না রাখে, এবং এটি সাধারণত প্রেফার করা হয় যখন নির্ভরশীলতা অপরিহার্য এবং একবার সেট হলে আর পরিবর্তন করা উচিত নয়।
- Setter Injection অনেক বেশি নমনীয়, যেখানে নির্ভরশীলতাগুলি পরে সেট করা যেতে পারে।
Spring Framework এবং অন্যান্য IoC কন্টেইনারে DI ব্যবহৃত হয়, যা কোডের loose coupling নিশ্চিত করে এবং উন্নত টেস্টিং এবং রক্ষণাবেক্ষণের সুযোগ প্রদান করে।
Read more