Spring IoC (Inversion of Control) Container একটি মৌলিক ধারণা যা Spring Framework এর মূল ভিত্তি। IoC এর মাধ্যমে, Spring কনটেইনার আমাদের অ্যাপ্লিকেশনের অবজেক্টগুলিকে ম্যানেজ করে এবং তাদের মধ্যে Dependency Injection (DI) ব্যবহার করে একে অপরকে সংযুক্ত করে। এতে কোডের loose coupling সৃষ্টি হয় এবং flexibility বাড়ে।
Spring IoC কনটেইনার ম্যানেজ করে:
- Bean তৈরি করা
- Bean এর lifecycle পরিচালনা করা
- Bean এর মধ্যে Dependency Injection বাস্তবায়ন করা
এখানে, আমরা Spring IoC Container এবং Dependency Injection (DI) এর ব্যবহার দেখাব, যাতে একটি প্রাথমিক Spring অ্যাপ্লিকেশন তৈরি করা যাবে।
1. Spring IoC Container এর ধারণা
Spring IoC কনটেইনার প্রধানত দুটি ধরণের হয়:
- BeanFactory: এটি Spring Framework এর পুরানো কনটেইনার, তবে বর্তমানে ApplicationContext অধিক ব্যবহৃত হয়।
- ApplicationContext: এটি BeanFactory এর উন্নত সংস্করণ এবং Spring Framework এর মধ্যে জনপ্রিয় কনটেইনার।
ApplicationContext কনটেইনার Bean এর কনফিগারেশন ও লোডিং, ইনস্ট্যান্সিয়েশন এবং Dependency Injection (DI) পরিচালনা করে। এটি Spring MVC, Spring AOP, এবং অন্যান্য Spring মডিউলগুলির জন্য গুরুত্বপূর্ণ।
2. Spring IoC Container এর উদাহরণ
এখানে একটি সাধারণ উদাহরণ দেওয়া হয়েছে যেখানে Spring IoC কনটেইনার ব্যবহার করে একটি EmployeeService Bean তৈরি করা হয়েছে এবং সেটিতে Dependency Injection প্রয়োগ করা হয়েছে।
2.1 Spring IoC Container এবং Dependency Injection কনফিগারেশন
প্রথমে, আমরা একটি EmployeeService ক্লাস তৈরি করব, যা একটি DepartmentService ক্লাসের উপর নির্ভরশীল।
DepartmentService ক্লাস
package com.example.demo.service;
public class DepartmentService {
public void displayDepartment() {
System.out.println("This is the IT department.");
}
}
এখানে, DepartmentService একটি সিম্পল ক্লাস যা একটি মেথড displayDepartment() রাখে, যা একটি ডিপার্টমেন্টের নাম প্রিন্ট করবে।
EmployeeService ক্লাস
package com.example.demo.service;
public class EmployeeService {
private DepartmentService departmentService;
// Constructor Injection for Dependency Injection
public EmployeeService(DepartmentService departmentService) {
this.departmentService = departmentService;
}
public void displayEmployeeDetails() {
System.out.println("Employee details:");
departmentService.displayDepartment();
}
}
এখানে, EmployeeService একটি ডিপার্টমেন্টের ডিটেইলস দেখানোর জন্য DepartmentService এর উপর নির্ভরশীল। এই ক্লাসে Constructor Injection এর মাধ্যমে DepartmentService ইনজেক্ট করা হয়েছে।
3. Spring IoC Container কনফিগারেশন
এখন, আমরা Spring IoC কনটেইনার কনফিগার করব এবং Spring কনটেইনার ব্যবহার করে EmployeeService এবং DepartmentService Bean ইনস্ট্যান্স করব।
ApplicationContext কনফিগারেশন
Spring IoC কনটেইনার ব্যবহার করার জন্য ApplicationContext কনফিগারেশন তৈরি করতে হবে। এখানে আমরা AnnotationConfigApplicationContext ব্যবহার করব এবং ম্যানুয়ালি Bean কনফিগার করব।
package com.example.demo;
import com.example.demo.service.DepartmentService;
import com.example.demo.service.EmployeeService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringIoCExample {
public static void main(String[] args) {
// Initialize Spring ApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
// Get the EmployeeService bean from the IoC container
EmployeeService employeeService = context.getBean(EmployeeService.class);
// Call the method
employeeService.displayEmployeeDetails();
}
}
এখানে:
- AnnotationConfigApplicationContext: এটি Spring IoC কনটেইনারকে কনফিগার করে এবং SpringConfig.class কে পাস করে Spring কনফিগারেশন লোড করে।
- context.getBean(EmployeeService.class): এটি Spring কনটেইনার থেকে EmployeeService Bean রিটার্ন করবে এবং তার পরবর্তী মেথড কল করবে।
SpringConfig কনফিগারেশন ক্লাস
package com.example.demo;
import com.example.demo.service.DepartmentService;
import com.example.demo.service.EmployeeService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public DepartmentService departmentService() {
return new DepartmentService();
}
@Bean
public EmployeeService employeeService() {
return new EmployeeService(departmentService()); // Injecting DepartmentService
}
}
এখানে:
- @Configuration: এই অ্যানোটেশনটি Spring কনফিগারেশন ক্লাসকে চিহ্নিত করে।
- @Bean: এই অ্যানোটেশনটি Spring IoC কনটেইনারে Bean তৈরি করে।
employeeService()মেথডে DepartmentService Bean ইনজেক্ট করা হয়েছে।
4. Application Properties
Spring IoC কনটেইনারে Bean কনফিগারেশন সাধারণত Java-based configuration এ করা হয়, তবে আপনি application.properties ফাইল ব্যবহার করেও কিছু কনফিগারেশন করতে পারেন।
যেমন, application.properties এ ক্যাশিং, ট্রান্সঅ্যাকশন কনফিগারেশন ইত্যাদি সেট করা যেতে পারে, তবে এই উদাহরণে এটি ব্যবহার করার প্রয়োজন নেই।
5. আউটপুট
এখন, আপনার SpringIoCExample ক্লাস চালালে Spring IoC কনটেইনারের মাধ্যমে DepartmentService Bean ইনজেক্ট হবে এবং তারপর EmployeeService Bean মেথড কল করবে।
আউটপুট:
Employee details:
This is the IT department.
এখানে, EmployeeService মেথডে DepartmentService Bean ইনজেক্ট হয়ে, ডিপার্টমেন্টের নাম প্রিন্ট করছে।
6. সারাংশ
Spring IoC Container এবং Dependency Injection (DI) ব্যবহার করে Spring Framework এর মাধ্যমে আমরা খুব সহজেই অ্যাপ্লিকেশনের Bean গুলি ম্যানেজ করতে পারি। IoC কনটেইনার Spring Bean গুলির ক্রিয়েশন, ম্যানেজমেন্ট এবং ডিপেনডেন্সি ইনজেকশন নিশ্চিত করে, যা কোডের loose coupling এবং maintainability বৃদ্ধি করে। এই উদাহরণে, আমরা দেখলাম কিভাবে EmployeeService এবং DepartmentService Bean তৈরি করা হয় এবং তাদের মধ্যে Dependency Injection বাস্তবায়িত হয়।
Read more