Spring Framework এর ডিপেনডেন্সি ইনজেকশন (Dependency Injection - DI) একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অবজেক্টগুলির মধ্যে সম্পর্ক পরিচালনা করে এবং তাদের নির্ভরশীলতাগুলি সরবরাহ করে। Spring এ ডিপেনডেন্সি ইনজেকশন করার দুটি প্রধান পদ্ধতি হল Constructor Injection এবং Setter Injection। এই দুটি পদ্ধতির মাধ্যমে আপনি ক্লাসের মধ্যে ডিপেনডেন্সি (অবজেক্টের সম্পর্ক) ইনজেক্ট করতে পারেন।
এই টিউটোরিয়ালে আমরা Constructor Injection এবং Setter Injection এর ব্যবহার এবং তাদের মধ্যে পার্থক্য সম্পর্কে বিস্তারিত আলোচনা করব।
Constructor Injection
Constructor Injection হল ডিপেনডেন্সি ইনজেকশনের একটি পদ্ধতি যেখানে ডিপেনডেন্সি (অবজেক্ট) ক্লাসের কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়। এই পদ্ধতিতে, Spring কনস্ট্রাক্টরের ইনপুট প্যারামিটারগুলির মাধ্যমে ডিপেনডেন্সি প্রদান করে।
সুবিধা:
- Immutable Objects: কনস্ট্রাক্টর ইনজেকশন ব্যবহার করলে অবজেক্টটি immutable (অপরিবর্তনীয়) হয়, অর্থাৎ একবার সেট করা হলে ডিপেনডেন্সি পরিবর্তন করা যায় না।
- Required Dependencies: সমস্ত প্রয়োজনীয় ডিপেনডেন্সি ইনজেক্ট করা হয়, কারণ কনস্ট্রাক্টর কল করতে হলে সব প্যারামিটারকে প্রোভাইড করতে হবে।
- Compile-time checking: কনস্ট্রাক্টর ইনজেকশন ব্যবহার করলে কম্পাইল-টাইমে ডিপেনডেন্সি চেকিং করা সম্ভব হয়।
উদাহরণ: Constructor Injection
@Component
public class EmployeeService {
private final EmployeeRepository employeeRepository;
// Constructor Injection
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
}
@Component
public class EmployeeRepository {
public void save(Employee employee) {
System.out.println("Employee saved: " + employee.getName());
}
}
এখানে:
- EmployeeService ক্লাসের কনস্ট্রাক্টরটি
EmployeeRepositoryকে ইনজেক্ট করে। - Spring কনটেইনার যখন
EmployeeServiceক্লাসের একটি অবজেক্ট তৈরি করবে, তখনEmployeeRepositoryস্বয়ংক্রিয়ভাবে কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হবে।
Spring Configuration (XML/Java Config):
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// Spring automatic DI will work based on constructor injection
}
এখানে, @Component অ্যানোটেশন দ্বারা Spring জানে যে, এই ক্লাসগুলি Spring Bean হিসেবে ব্যবহার হবে। Spring EmployeeService এর কনস্ট্রাক্টরকে স্বয়ংক্রিয়ভাবে EmployeeRepository ইনজেক্ট করবে।
Setter Injection
Setter Injection হল ডিপেনডেন্সি ইনজেকশনের আরেকটি পদ্ধতি, যেখানে ডিপেনডেন্সি (অবজেক্ট) ক্লাসের setter method এর মাধ্যমে ইনজেক্ট করা হয়। এই পদ্ধতিতে, আপনি setter methods তৈরি করেন, যেগুলোর মাধ্যমে Spring ডিপেনডেন্সি প্রদান করে।
সুবিধা:
- Optional Dependencies: যদি কোনো ডিপেনডেন্সি ঐচ্ছিক (optional) হয়, তাহলে সেটার জন্য setter injection সবচেয়ে ভালো।
- Flexibility: setter method ব্যবহার করার ফলে অবজেক্ট তৈরির পরে ডিপেনডেন্সি সেট করা যায়, তাই এটি কিছুটা লচিল হতে পারে।
উদাহরণ: Setter Injection
@Component
public class EmployeeService {
private EmployeeRepository employeeRepository;
// Setter Injection
@Autowired
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
}
@Component
public class EmployeeRepository {
public void save(Employee employee) {
System.out.println("Employee saved: " + employee.getName());
}
}
এখানে:
- setEmployeeRepository মেথডের মাধ্যমে
EmployeeRepositoryইনজেক্ট করা হয়েছে। - Spring @Autowired অ্যানোটেশন দিয়ে setter method কে স্বয়ংক্রিয়ভাবে ইনজেক্ট করবে।
Spring Configuration (XML/Java Config):
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// Spring automatic DI will work based on setter injection
}
এখানে, @Autowired অ্যানোটেশনটি Springকে নির্দেশ দেয় যে এটি ইনজেকশন পয়েন্ট এবং Spring এই setter method এর মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করবে।
Constructor Injection এবং Setter Injection এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Constructor Injection | Setter Injection |
|---|---|---|
| মেথড | কনস্ট্রাক্টর মাধ্যমে ইনজেকশন | Setter মেথড মাধ্যমে ইনজেকশন |
| ডিপেনডেন্সি | সব ডিপেনডেন্সি আবশ্যক (required dependencies) | কিছু ডিপেনডেন্সি ঐচ্ছিক হতে পারে |
| অবজেক্টের পরিবর্তন | একবার ইনজেক্ট করার পর পরিবর্তন করা যায় না | ইনজেকশন পরে ডিপেনডেন্সি পরিবর্তন করা সম্ভব |
| কমপ্লেক্সিটি | একটু কমপ্লেক্স (মেথড প্যারামিটার নিতে হবে) | সহজ এবং সহজে পরিবর্তনযোগ্য |
| পছন্দের পরিস্থিতি | যখন ডিপেনডেন্সি অপরিহার্য | যখন ডিপেনডেন্সি ঐচ্ছিক বা লেট ইনজেকশন দরকার |
সারাংশ
Constructor Injection এবং Setter Injection হল Spring DI (Dependency Injection) এর দুটি গুরুত্বপূর্ণ পদ্ধতি।
- Constructor Injection ব্যবহার করা হয় যখন আপনি নিশ্চিত চান যে সব ডিপেনডেন্সি ইনজেক্ট হবে এবং এটি অপরিহার্য (required)।
- Setter Injection ব্যবহার করা হয় যখন কিছু ডিপেনডেন্সি ঐচ্ছিক হতে পারে এবং আপনি মেথডের মাধ্যমে তাদের ইনজেক্ট করতে চান।
Spring Framework এ এই দুটি পদ্ধতি ব্যবহার করে আপনি আপনার ক্লাসের ডিপেনডেন্সিগুলি সরবরাহ করতে পারবেন এবং কার্যকরীভাবে কোডের পুনরাবৃত্তি কমাতে পারবেন।
Read more