স্প্রিং ডিপেনডেন্সি ইনজেকশন (Dependency Injection - DI) হল একটি ডিজাইন প্যাটার্ন, যা অবজেক্টগুলির মধ্যে নির্ভরশীলতা (dependencies) স্বয়ংক্রিয়ভাবে ইনজেক্ট করে। স্প্রিং ফ্রেমওয়ার্কে, ডিপেনডেন্সি ইনজেকশনের জন্য দুটি প্রধান পদ্ধতি রয়েছে: Constructor Injection এবং Setter Injection। উভয় পদ্ধতিই Beans এর মধ্যে ডিপেনডেন্সি ইনজেক্ট করার জন্য ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে।
১. Constructor Injection
Constructor Injection হল একটি পদ্ধতি যেখানে ডিপেনডেন্সি (dependencies) একটি ক্লাসের কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়। যখন স্প্রিং কনটেইনার একটি Bean তৈরি করে, তখন এটি সংশ্লিষ্ট কনস্ট্রাক্টরের মাধ্যমে প্রয়োজনীয় ডিপেনডেন্সি ইনজেক্ট করে।
সুবিধাসমূহ:
- ইনজেকশন অপরিহার্য: যদি Bean এর প্রোপার্টি কোন নির্দিষ্ট মান ছাড়া কাজ না করতে পারে, তবে কনস্ট্রাক্টর ইনজেকশন ব্যবহার করা ভালো, কারণ এটি ইনজেকশনের সময় ইনপুটের বাধ্যতামূলকতা নিশ্চিত করে।
- ইমিউটেবল অবজেক্ট: কনস্ট্রাক্টরের মাধ্যমে ইনজেকশন হলে, অবজেক্টগুলি সাধারণত ইমিউটেবল (immutable) হয়ে থাকে, অর্থাৎ একবার তৈরি হওয়ার পর তাদের স্টেট পরিবর্তন করা যায় না।
- ডিপেনডেন্সি স্পষ্ট: কনস্ট্রাক্টর ইনজেকশন ব্যবহার করলে Bean এর ডিপেনডেন্সি স্পষ্টভাবে চিহ্নিত থাকে এবং এটি কোডের ক্লিনলিনেস বজায় রাখে।
উদাহরণ: Constructor Injection
@Component
public class EmployeeService {
private final EmployeeRepository employeeRepository;
@Autowired
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void performService() {
System.out.println("Service performed with: " + employeeRepository.getData());
}
}
এখানে, EmployeeService ক্লাসের কনস্ট্রাক্টরকে EmployeeRepository ইনজেক্ট করা হচ্ছে।
২. Setter Injection
Setter Injection হল একটি পদ্ধতি যেখানে ডিপেনডেন্সি Bean এর setter method এর মাধ্যমে ইনজেক্ট করা হয়। স্প্রিং কনটেইনার একটি Bean তৈরি করার পরে, এটি ডিপেনডেন্সি গুলি setter মেথডের মাধ্যমে সেট করে।
সুবিধাসমূহ:
- ঐচ্ছিক ডিপেনডেন্সি: যদি কোনো ডিপেনডেন্সি ঐচ্ছিক (optional) হয়, তবে setter injection ব্যবহার করা ভাল। এটি কিছু ডিপেনডেন্সি ইনজেক্ট না করলেও Bean কার্যকর থাকবে।
- কনফিগারেশন সহজ: স্প্রিং কনটেইনারে সহজে setter মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করা যায়, বিশেষত যখন ডিপেনডেন্সিগুলি পরে সেট করতে হয়।
উদাহরণ: Setter Injection
@Component
public class EmployeeService {
private EmployeeRepository employeeRepository;
@Autowired
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void performService() {
System.out.println("Service performed with: " + employeeRepository.getData());
}
}
এখানে, EmployeeService ক্লাসে EmployeeRepository কে setter method এর মাধ্যমে ইনজেক্ট করা হচ্ছে।
Constructor Injection এবং Setter Injection এর মধ্যে পার্থক্য
| প্যারামিটার | Constructor Injection | Setter Injection |
|---|---|---|
| ইনজেকশন টাইপ | কনস্ট্রাক্টরের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করা হয় | setter method এর মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করা হয় |
| ইনজেকশন বাধ্যতামূলক | কনস্ট্রাক্টর ইনজেকশন সাধারণত বাধ্যতামূলক (mandatory) | setter ইনজেকশন ঐচ্ছিক (optional) হতে পারে |
| অবজেক্টের ইমিউটেবিলিটি | অবজেক্টটি ইমিউটেবল থাকতে পারে (immutable) | অবজেক্টটির স্টেট পরিবর্তনযোগ্য (mutable) |
| ডিপেনডেন্সির স্পষ্টতা | ডিপেনডেন্সি স্পষ্টভাবে কনস্ট্রাক্টরে প্রকাশিত হয় | setter মেথডের মাধ্যমে ইনজেকশন হওয়ায় কম স্পষ্ট |
| লঙ্ঘন ও পরিবর্তনযোগ্যতা | ডিপেনডেন্সি একবার ইনজেক্ট হলে তা পরিবর্তনযোগ্য নয় | ডিপেনডেন্সি যে কোনো সময় পরিবর্তন করা যায় |
| ডিপেনডেন্সি ইনজেকশনের পরিমাণ | একবারে সব ডিপেনডেন্সি ইনজেক্ট করা হয় | ডিপেনডেন্সি গুলি পরে ইনজেক্ট করা যেতে পারে |
উপসংহার
Constructor Injection এবং Setter Injection উভয়ই স্প্রিং ডিপেনডেন্সি ইনজেকশন প্রক্রিয়ার অংশ, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে।
- Constructor Injection সাধারণত তখন ব্যবহার করা হয় যখন ডিপেনডেন্সিগুলি অপরিহার্য এবং অবজেক্ট ইমিউটেবল রাখতে হয়।
- Setter Injection ব্যবহার করা হয় যখন ডিপেনডেন্সিগুলি ঐচ্ছিক এবং আপনার অবজেক্টের স্টেট পরে পরিবর্তন করার প্রয়োজন হতে পারে।
ডিপেনডেন্সি ইনজেকশনের পদ্ধতি নির্বাচন করার সময়, আপনার অ্যাপ্লিকেশন এর আর্কিটেকচার এবং ডিপেনডেন্সির প্রয়োজনীয়তার উপর ভিত্তি করে সঠিক পদ্ধতি নির্বাচন করা উচিত।
Read more