Dependency Injection (DI) হলো একটি ডিজাইন প্যাটার্ন, যা স্প্রিং ফ্রেমওয়ার্কের মূল বৈশিষ্ট্যগুলোর মধ্যে একটি। DI-এর মাধ্যমে একটি ক্লাসের নির্ভরশীলতাগুলো (Dependencies) তার বাইরের কোনো উৎস থেকে ইনজেক্ট করা হয়, ফলে কোডটি ডিকাপলড (Decoupled) এবং মডুলার হয়।
DI-এর প্রধান প্রকারভেদ
- Constructor Injection: ডিপেনডেন্সি ক্লাসের কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়।
- Setter Injection: ডিপেনডেন্সি Setter মেথডের মাধ্যমে ইনজেক্ট করা হয়।
- Field Injection: ডিপেনডেন্সি সরাসরি ফিল্ডে ইনজেক্ট করা হয় (Spring Framework 4.3 বা পরবর্তী সংস্করণে সহজলভ্য)।
উদাহরণ: DI-এর ব্যবহার
Step 1: Maven ডিপেনডেন্সি
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.0</version>
</dependency>
Step 2: Service এবং Repository ক্লাস তৈরি
EmployeeRepository.java
@Component
public class EmployeeRepository {
public String fetchEmployeeData() {
return "Employee Data from Database";
}
}
EmployeeService.java
@Component
public class EmployeeService {
private final EmployeeRepository employeeRepository;
// Constructor Injection
@Autowired
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void displayEmployeeData() {
String data = employeeRepository.fetchEmployeeData();
System.out.println("Service Layer: " + data);
}
}
Step 3: Configuration Class তৈরি
AppConfig.java
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
Step 4: মেইন ক্লাস
MainApplication.java
public class MainApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// DI এর মাধ্যমে EmployeeService Bean পাওয়া
EmployeeService employeeService = context.getBean(EmployeeService.class);
employeeService.displayEmployeeData();
context.close();
}
}
আউটপুট
Service Layer: Employee Data from Database
DI-এর অন্যান্য পদ্ধতি (Setter এবং Field Injection)
Setter Injection
EmployeeService.java
@Component
public class EmployeeService {
private EmployeeRepository employeeRepository;
// Setter Injection
@Autowired
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void displayEmployeeData() {
String data = employeeRepository.fetchEmployeeData();
System.out.println("Service Layer: " + data);
}
}
Field Injection
EmployeeService.java
@Component
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public void displayEmployeeData() {
String data = employeeRepository.fetchEmployeeData();
System.out.println("Service Layer: " + data);
}
}
ব্যাখ্যা
- Constructor Injection:
- এটি Immutable Dependency-এর জন্য সবচেয়ে ভালো পদ্ধতি।
- ডিপেনডেন্সিগুলো কনস্ট্রাক্টর প্যারামিটার হিসেবে পাস করা হয়।
- Setter Injection:
- Optional Dependency-এর জন্য কার্যকর।
- Setter মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করা হয়।
- Field Injection:
- সবচেয়ে সহজ এবং দ্রুত পদ্ধতি, তবে এটি টেস্টিংয়ে সীমাবদ্ধতা সৃষ্টি করতে পারে।
উপসংহার
স্প্রিং ফ্রেমওয়ার্কে DI একটি গুরুত্বপূর্ণ ফিচার যা কোডের Coupling কমায় এবং রিইউজেবিলিটি বাড়ায়। Constructor Injection সাধারণত সেরা পদ্ধতি হিসেবে বিবেচিত হয়, তবে নির্ভরশীলতার প্রয়োজন অনুযায়ী Setter এবং Field Injectionও ব্যবহৃত হতে পারে।
Content added By
Read more