স্প্রিং ডিপেনডেন্সি ইনজেকশন (DI) হল একটি প্রযুক্তি যা কোডের মধ্যে loose coupling তৈরি করে, অর্থাৎ একটি ক্লাসের উপর অন্য ক্লাসের নির্ভরশীলতা কমায়। এটি স্প্রিং কনটেইনারের মাধ্যমে ডিপেনডেন্সি ইনজেকশন ব্যবস্থাপনা সহজ করে। External Configuration এর মাধ্যমে স্প্রিং ডিপেনডেন্সি ইনজেকশন পরিচালনা করা হয়, যার মাধ্যমে অ্যাপ্লিকেশন কনফিগারেশন এবং ডিপেনডেন্সি এক্সটারনালি (অর্থাৎ, স্প্রিং কনফিগারেশন ফাইল বা প্রোপার্টি ফাইলের মাধ্যমে) পরিচালনা করা সম্ভব হয়।
স্প্রিং এ External Configuration বলতে বুঝায় এমন কনফিগারেশন যা স্প্রিং কনটেইনারে সরাসরি কোডে না লিখে, বরং একটি এক্সটারনাল ফাইলে সংরক্ষণ করা হয়। এই কনফিগারেশন ফাইল সাধারণত XML, Properties ফাইল বা Annotation-based configuration হতে পারে। এই পদ্ধতিতে আমরা DI (Dependency Injection) সম্পাদন করি।
External Configuration এবং Dependency Injection (DI)
স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশন ব্যবস্থাপনার জন্য কনফিগারেশন ফাইল ব্যবহার করা হয়। ডিপেনডেন্সিগুলোর কনফিগারেশন এবং ইনজেকশন পরিচালনা করা হয় স্প্রিং কনটেইনারের মাধ্যমে। প্রধান দুটি পদ্ধতি রয়েছে:
- XML-based Configuration (প্রাচীন পদ্ধতি)
- Annotation-based Configuration (নতুন পদ্ধতি)
1. XML-based Configuration (Traditional)
XML কনফিগারেশন স্প্রিং ডিপেনডেন্সি ইনজেকশনের জন্য একটি প্রাচীন পদ্ধতি। এখানে সব ধরনের Bean এবং তাদের ডিপেনডেন্সি XML ফাইলে সংজ্ঞায়িত করা হয়।
উদাহরণ: XML-based Dependency Injection
beans.xml কনফিগারেশন ফাইল
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Bean Definition for EmployeeService -->
<bean id="employeeService" class="com.example.EmployeeService">
<constructor-arg ref="employeeRepository"/>
</bean>
<!-- Bean Definition for EmployeeRepository -->
<bean id="employeeRepository" class="com.example.EmployeeRepository"/>
</beans>
EmployeeService.java ক্লাস
public class EmployeeService {
private EmployeeRepository employeeRepository;
// Constructor-based Dependency Injection
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee() {
employeeRepository.save();
}
}
EmployeeRepository.java ক্লাস
public class EmployeeRepository {
public void save() {
System.out.println("Employee saved");
}
}
এখানে, EmployeeService Bean এর মধ্যে EmployeeRepository Bean ইনজেক্ট করা হয়েছে XML-based configuration এর মাধ্যমে।
2. Annotation-based Configuration (Modern Approach)
এটি স্প্রিং ফ্রেমওয়ার্কের আধুনিক এবং সহজ পদ্ধতি। এখানে @Component, @Autowired এবং @Configuration অ্যানোটেশন ব্যবহার করে ডিপেনডেন্সি ইনজেকশন কনফিগারেশন পরিচালিত হয়।
উদাহরণ: Annotation-based Dependency Injection
EmployeeService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class EmployeeService {
private EmployeeRepository employeeRepository;
@Autowired // Autowire the dependency
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee() {
employeeRepository.save();
}
}
EmployeeRepository.java
import org.springframework.stereotype.Component;
@Component
public class EmployeeRepository {
public void save() {
System.out.println("Employee saved");
}
}
AppConfig.java (Configuration Class)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// Beans will be auto-detected and injected via annotations
}
MainApplication.java (Main Application)
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApplication {
public static void main(String[] args) {
// Initialize Spring container
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Retrieve bean from the context
EmployeeService employeeService = context.getBean(EmployeeService.class);
// Use the bean
employeeService.saveEmployee();
context.close();
}
}
এখানে, @Autowired অ্যানোটেশন ব্যবহার করে EmployeeRepository ইনজেক্ট করা হচ্ছে এবং @Component অ্যানোটেশন ব্যবহার করে EmployeeService এবং EmployeeRepository Beans ডিফাইন করা হয়েছে। স্প্রিং কনটেইনার এই Beans গুলি অ্যাপ্লিকেশন কোডে ইনজেক্ট করবে।
3. External Configuration via Property Files
স্প্রিং ডিপেনডেন্সি ইনজেকশন কনফিগারেশন প্রপার্টি ফাইলের মাধ্যমে এক্সটারনালি করা যেতে পারে। যেমন, application.properties বা application.yml ফাইল ব্যবহার করে কনফিগারেশন ম্যানেজমেন্ট করা হয়।
উদাহরণ: External Configuration using application.properties
application.properties ফাইল
employee.name=John Doe
employee.age=30
EmployeeService.java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EmployeeService {
@Value("${employee.name}")
private String name;
@Value("${employee.age}")
private int age;
public void displayEmployeeInfo() {
System.out.println("Employee Name: " + name + ", Age: " + age);
}
}
এখানে, employee.name এবং employee.age প্রপার্টি ফাইল থেকে @Value অ্যানোটেশন ব্যবহার করে ভ্যালু ইনজেক্ট করা হচ্ছে।
AppConfig.java (Configuration Class)
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example")
@PropertySource("classpath:application.properties")
public class AppConfig {
}
এখানে, @PropertySource অ্যানোটেশন ব্যবহার করে স্প্রিং কনটেইনারকে application.properties ফাইল থেকে কনফিগারেশন লোড করতে নির্দেশ দেয়া হচ্ছে।
সারাংশ
External Configuration এবং Dependency Injection (DI) স্প্রিং ফ্রেমওয়ার্কে কোডের মাঝে ঢিলামি (loose coupling) আনা এবং ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করার জন্য ব্যবহৃত হয়। XML-based configuration এবং Annotation-based configuration এর মাধ্যমে স্প্রিং কনটেইনার ডিপেনডেন্সি ইনজেকশন পরিচালনা করে। এছাড়াও, স্প্রিং প্রপার্টি ফাইল (যেমন application.properties) ব্যবহার করে এক্সটারনাল কনফিগারেশন করা যায়। এই সব পদ্ধতি ব্যবহার করে স্প্রিং অ্যাপ্লিকেশনগুলোকে আরও ফ্লেক্সিবল, মেইনটেইনেবল এবং স্কেলেবল করা যায়।
Read more