Spring IoC (Inversion of Control) Container হল Spring Framework এর একটি মৌলিক এবং গুরুত্বপূর্ণ অংশ। এটি Dependency Injection (DI) ধারণার উপর ভিত্তি করে কাজ করে এবং অ্যাপ্লিকেশনের অবজেক্টগুলি তৈরি এবং পরিচালনা করার দায়িত্ব নেয়। Spring IoC Container-এর মাধ্যমে আপনি কোডের মধ্যে অবজেক্ট তৈরির প্রক্রিয়াটি Spring Framework এর হাতে ছেড়ে দেন, যার ফলে কোড মডুলার, রিইউজেবল এবং টেস্টেবল হয়।
IoC Container এমন একটি কনটেইনার যা Spring Framework এর মাধ্যমে অবজেক্ট তৈরি করে এবং সেগুলির ডিপেনডেন্সি ইনজেক্ট করে। এর মাধ্যমে একটি অবজেক্ট অন্য একটি অবজেক্টের উপর নির্ভরশীল থাকতে পারে এবং Spring এই সম্পর্কটি পরিচালনা করে। এটি Dependency Injection (DI) এর মাধ্যমে অবজেক্টগুলির মধ্যে সম্পর্ক স্থাপন করে, যার ফলে কোডের মধ্যে নির্ভরশীলতা (dependencies) ম্যানেজ করা সহজ হয়।
IoC Container প্রধানত দুটি কাজ সম্পাদন করে:
Spring IoC Container দুটি প্রধান উপাদানে বিভক্ত:
Bean হল Spring IoC Container দ্বারা তৈরি এবং পরিচালিত একটি অবজেক্ট। Spring Beans সাধারণত Java ক্লাসের অবজেক্ট যা Spring IoC Container দ্বারা তৈরি এবং ইনস্ট্যানশিয়েট করা হয়। Spring Container Beans এর lifecycle এবং dependencies পরিচালনা করে।
Spring Bean তৈরির জন্য আপনাকে @Bean
, @Component
, @Service
, @Repository
বা @Controller
অ্যানোটেশন ব্যবহার করতে হয়। এগুলো Spring IoC Container এ Bean সনাক্ত করতে সাহায্য করে।
Spring IoC Container কনফিগার করার প্রধান দুটি পদ্ধতি আছে:
Spring IoC Container কনফিগার করার জন্য XML কনফিগারেশন ব্যবহার করলে আপনি applicationContext.xml
ফাইলে Bean কনফিগার করতে পারেন।
<?xml version="1.0" encoding="UTF-8"?>
<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 Definitions -->
<bean id="employeeService" class="com.example.EmployeeService">
<property name="employeeRepository" ref="employeeRepository"/>
</bean>
<bean id="employeeRepository" class="com.example.EmployeeRepository"/>
</beans>
এখানে, employeeService Bean কনফিগার করা হয়েছে এবং তার employeeRepository ডিপেনডেন্সি ref="employeeRepository" দ্বারা ইনজেক্ট করা হয়েছে।
Java Configuration পদ্ধতিতে আপনি @Configuration এবং @Bean অ্যানোটেশন ব্যবহার করে Spring IoC Container কনফিগার করতে পারেন।
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.service.EmployeeService;
import com.example.repository.EmployeeRepository;
@Configuration
public class AppConfig {
@Bean
public EmployeeService employeeService() {
EmployeeService employeeService = new EmployeeService();
employeeService.setEmployeeRepository(employeeRepository());
return employeeService;
}
@Bean
public EmployeeRepository employeeRepository() {
return new EmployeeRepository();
}
}
এখানে, @Bean অ্যানোটেশন দ্বারা Beans কনফিগার করা হয়েছে এবং তাদের ডিপেনডেন্সি ম্যানুয়ালি ইনজেক্ট করা হয়েছে।
Dependency Injection (DI) হলো Spring IoC Container এর মাধ্যমে অবজেক্টের মধ্যে তাদের ডিপেনডেন্সি ইনজেক্ট করা। DI Spring Framework এর সবচেয়ে শক্তিশালী বৈশিষ্ট্য, যার মাধ্যমে আপনি একটি ক্লাসের ডিপেনডেন্সি অন্য ক্লাসের মাধ্যমে ইনজেক্ট করতে পারেন।
package com.example.service;
import com.example.repository.EmployeeRepository;
public class EmployeeService {
private EmployeeRepository employeeRepository;
// Constructor-based DI
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void processEmployeeData() {
employeeRepository.fetchEmployeeData();
}
}
package com.example.service;
import com.example.repository.EmployeeRepository;
public class EmployeeService {
private EmployeeRepository employeeRepository;
// Setter-based DI
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void processEmployeeData() {
employeeRepository.fetchEmployeeData();
}
}
Spring IoC Container Spring Framework এর একটি গুরুত্বপূর্ণ অংশ, যা Dependency Injection (DI) এর মাধ্যমে অবজেক্ট তৈরি এবং ডিপেনডেন্সি ইনজেক্ট করে। Spring IoC Container এর মাধ্যমে কোডের মডুলারিটি, রিইউজেবিলিটি, এবং টেস্টেবলিটি বৃদ্ধি পায়। BeanFactory এবং ApplicationContext দুটি প্রধান IoC Container যা Bean তৈরি এবং Dependency Injection এর কাজ করে। XML বা Java Config এর মাধ্যমে Spring IoC Container কনফিগার করা হয়। Spring IoC Container এর মাধ্যমে কোডের ক্রস-কাটিং কনসার্ন এবং ম্যানেজমেন্ট আরো সহজ এবং কার্যকরী হয়।
IoC (Inversion of Control) হল একটি ডিজাইন প্যাটার্ন যা অ্যাপ্লিকেশন কোডের দায়িত্ব ও নিয়ন্ত্রণ এক্সটার্নাল কম্পোনেন্টের হাতে তুলে দেয়, যাতে কোড আরও নমনীয়, রিইউজেবল এবং টেস্টযোগ্য হয়। Spring Framework-এর একটি মূল অংশ হল IoC Container, যা Spring অ্যাপ্লিকেশনকে সম্পূর্ণভাবে পরিচালনা করে এবং এটি নির্ধারণ করে কোন ক্লাসটি কখন এবং কীভাবে ইনস্ট্যান্সিয়েট হবে।
Spring IoC Container একটি বিশেষ উপাদান যা ডিপেনডেন্সি ইনজেকশন (Dependency Injection বা DI) ব্যবহার করে অবজেক্ট তৈরি, কনফিগার এবং ম্যানেজ করে। Spring Container মূলত অবজেক্টের লাইফসাইকেল এবং তাদের নির্ভরশীলতা ম্যানেজ করে।
Spring IoC Container হল একটি Java Object Container যা অবজেক্ট ইনস্ট্যান্সিয়েশন, কনফিগারেশন এবং ডিপেনডেন্সি ম্যানেজমেন্টের দায়িত্ব নেয়ার মাধ্যমে অ্যাপ্লিকেশনের কম্পোনেন্টগুলিকে তৈরি এবং পরিচালনা করে। এটি মূলত bean (অবজেক্ট) তৈরির দায়িত্বে থাকে এবং Bean Definition অনুযায়ী তাদের প্রয়োগ এবং পরিচালনা করে।
Spring IoC Container দুটি প্রধান দায়িত্বে থাকে:
Spring IoC Container প্রথমে bean গুলোর কনফিগারেশন বা ডেফিনিশন করে। এটি applicationContext.xml
বা Java Config এর মাধ্যমে করা যায়। এই কনফিগারেশনের মধ্যে বলা হয়, কোন ক্লাসটি Bean হিসেবে ব্যবহার করা হবে এবং সেটি কীভাবে ইনস্ট্যান্সিয়েট হবে।
IoC Container Bean গুলোর মধ্যে Dependency Injection (DI) পরিচালনা করে, অর্থাৎ একটি Bean অন্য Bean এর উপর নির্ভরশীল হলে, সেই নির্ভরশীলতা (dependency) IoC Container ইনজেক্ট করে।
Spring IoC Container Bean-এর লাইফসাইকেল ম্যানেজমেন্ট করে, যার মধ্যে রয়েছে Bean তৈরির সময়, Bean এর প্রয়োজনীয় কনফিগারেশন, এবং Bean প্রয়োগের পরে তার পরিষ্কারকরণ। Spring Container Bean-এর ধাপে ধাপে সঠিক পরিচালনা নিশ্চিত করে, যাতে অ্যাপ্লিকেশন কাজ করার সময় কোন সমস্যার সম্মুখীন না হয়।
BeanFactory
হল Spring-এর একটি প্রাথমিক IoC Container যা মূলত lightweight এবং lazy loading ভিত্তিক।ApplicationContext
BeanFactory এর সমস্ত ফিচার সরবরাহ করে, তবে এতে কিছু অতিরিক্ত ফিচার রয়েছে, যেমন event propagation, AOP integration, এবং internationalization support।ClassPathXmlApplicationContext
AnnotationConfigApplicationContext
GenericWebApplicationContext
applicationContext.xml ফাইলে Beans কনফিগার করা হয়, যেখানে Bean গুলির class, scope, এবং অন্যান্য কনফিগারেশন থাকে।
<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 -->
<bean id="person" class="com.example.Person">
<property name="name" value="John Doe"/>
<property name="age" value="30"/>
</bean>
</beans>
এখানে, person
নামে একটি Bean কনফিগার করা হয়েছে যেটি com.example.Person
ক্লাসের ইনস্ট্যান্স। name
এবং age
প্রপার্টি ইনজেক্ট করা হচ্ছে।
Spring 3.x এর পর থেকে Java Configuration বা Annotation-Based Configuration ব্যবহৃত হচ্ছে। এখানে XML কনফিগারেশনের পরিবর্তে Java কোডের মাধ্যমে Bean কনফিগার করা হয়।
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public Person person() {
return new Person("John Doe", 30);
}
}
এখানে, @Configuration
এবং @Bean
অ্যানোটেশন ব্যবহার করা হয়েছে Bean কনফিগার করতে এবং Spring Container-এ Bean ইনস্ট্যান্স তৈরির জন্য।
Spring IoC Container Dependency Injection (DI) ব্যবহার করে বিভিন্ন Bean-এর মধ্যে ডিপেনডেন্সি ইনজেক্ট করে। এটি Constructor Injection এবং Setter Injection এর মাধ্যমে করা যায়।
public class Employee {
private Address address;
// Constructor Injection
public Employee(Address address) {
this.address = address;
}
public void showDetails() {
System.out.println("Employee Address: " + address.getCity());
}
}
public class Address {
private String city;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
public class Employee {
private Address address;
// Setter Injection
public void setAddress(Address address) {
this.address = address;
}
public void showDetails() {
System.out.println("Employee Address: " + address.getCity());
}
}
Spring IoC Container থেকে Bean রিট্রিভ করা হয় ApplicationContext
এর মাধ্যমে।
public class Main {
public static void main(String[] args) {
// XML Configuration Example
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// Bean Retrieval
Person person = (Person) context.getBean("person");
System.out.println(person.getName());
}
}
এখানে, ClassPathXmlApplicationContext
ব্যবহার করে applicationContext.xml
থেকে Bean লোড করা হচ্ছে এবং getBean
মেথডের মাধ্যমে person
Bean রিট্রিভ করা হচ্ছে।
Spring IoC Container হল একটি শক্তিশালী উপাদান যা Spring অ্যাপ্লিকেশনে Bean ইনস্ট্যান্সিয়েশন এবং Dependency Injection (DI) পরিচালনা করে। এটি ডিপেনডেন্সি ম্যানেজমেন্ট, Bean লাইফসাইকেল, এবং ক্রস-কাটিং কনসার্নের ব্যবস্থাপনা সহজ করে। Spring IoC Container-এ প্রধানত দুটি ধরণের কনটেইনার রয়েছে: BeanFactory
এবং ApplicationContext
, এবং এর মধ্যে ApplicationContext সবচেয়ে বেশি ব্যবহৃত হয়। IoC Container ব্যবহারের মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে আরো নমনীয়, রিইউজেবল, এবং টেস্টযোগ্য করতে পারেন।
Spring Framework-এ ApplicationContext এবং BeanFactory দুটি মূল ইন্টারফেস যা Spring IoC (Inversion of Control) কনটেইনারের মাধ্যমে বিইন (bean) ব্যবস্থাপনা করে। যদিও এই দুটি ইন্টারফেস অনেকাংশে একই কাজ করে, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। তাদের কাজ এবং ব্যবহার বুঝতে পারলে, আপনি সঠিকভাবে প্রয়োগ করতে পারবেন।
এখানে ApplicationContext এবং BeanFactory এর মধ্যে পার্থক্য বিস্তারিতভাবে আলোচনা করা হবে।
BeanFactory
Spring Framework এর বেসিক IoC কনটেইনার ইন্টারফেস। এটি Spring কনটেইনারের মূল ফাংশনালিটি প্রদান করে, যার মাধ্যমে Spring অ্যাপ্লিকেশনে beans তৈরি এবং ম্যানেজ করা হয়।ApplicationContext
হল BeanFactory
ইন্টারফেসের একটি বর্ধিত সংস্করণ (extended version)। এটি একটি পূর্ণাঙ্গ IoC কনটেইনার যা BeanFactory
এর সমস্ত ফিচারের পাশাপাশি আরও অনেক ফিচার যেমন ইভেন্ট ম্যানেজমেন্ট, মেসেজ রিসোর্স বেসড কনফিগারেশন, এবং AOP সাপোর্ট সরবরাহ করে।BeanFactory
এর উপর আরো উন্নত ফিচার সরবরাহ করে।BeanFactory
তুলনামূলকভাবে কম পারফরম্যান্স সম্পন্ন হতে পারে কারণ এটি কেবল তখনই beans তৈরি করে যখন তা প্রয়োজন হয়। এটি ফিচার এবং কনফিগারেশন কম থাকায় সাধারণত লাইটওয়েট কনটেইনার হিসেবে কাজ করে।ApplicationContext
বেশি ফিচার প্রদান করে, কিন্তু এতে ইনিশিয়াল লোডিং বেশি হয়ে থাকে এবং প্রাথমিক সময়টিতে বেশি মেমরি এবং কনফিগারেশন প্রয়োজন হয়।BeanFactory
ইভেন্ট হ্যান্ডলিং সাপোর্ট করে না। এটি শুধু beans তৈরি এবং ব্যবস্থাপনা করতে ব্যবহৃত হয়।ApplicationContext
ApplicationEvent এবং ApplicationListener এর মাধ্যমে ইভেন্ট হ্যান্ডলিং সাপোর্ট করে। এর মাধ্যমে Spring অ্যাপ্লিকেশন ইভেন্ট (যেমন context refresh, bean creation, bean destruction) হ্যান্ডেল করতে পারে।BeanFactory
এর মধ্যে internationalization (i18n) সাপোর্ট নেই।ApplicationContext
MessageSource এর মাধ্যমে i18n সমর্থন করে, যা বিভিন্ন ভাষা এবং লোকালাইজড রিসোর্স ম্যানেজমেন্টে সহায়তা করে।BeanFactory
সাধারণত low-memory applications বা lightweight applications এর জন্য উপযোগী, যেখানে শুধু bean creation এবং basic dependency injection প্রয়োজন হয়।ApplicationContext
Spring Framework এর প্রধান IoC কনটেইনার এবং সাধারণত enterprise-level applications বা web applications তৈরি করতে ব্যবহৃত হয়, যেখানে ইভেন্ট হ্যান্ডলিং, AOP, এবং বিভিন্ন মডিউলের জন্য একাধিক সুবিধা প্রয়োজন।BeanFactory
সাধারণত XML configuration বা Java-based configuration ব্যবহৃত হয়, যেখানে শুধুমাত্র bean-সংশ্লিষ্ট কনফিগারেশন করা হয়।ApplicationContext
আরো শক্তিশালী কনফিগারেশন সুবিধা প্রদান করে, যেমন annotation-based configuration (যেমন @Component
, @Autowired
, @Configuration
) এবং XML-based configuration যা বেশি শক্তিশালী এবং সুবিধাজনক।Criteria | BeanFactory | ApplicationContext |
---|---|---|
Purpose | Basic container for bean management | Full-featured container with additional functionalities like event handling, AOP, etc. |
Initialization | Lazy initialization | Eager initialization |
Event Handling | No support | Supports event handling (ApplicationEvent, ApplicationListener) |
Internationalization | No support | Supports i18n through MessageSource |
Performance | Lightweight, lower memory usage | Higher memory usage due to additional features |
Configuration | XML or Java-based configuration | XML-based or annotation-based configuration |
Use Case | Low-memory, embedded, legacy systems | Enterprise applications, web applications, Spring Boot projects |
ApplicationContext একটি পূর্ণাঙ্গ IoC কনটেইনার যা Spring Framework-এর সব ধরনের সুবিধা প্রদান করে, যেমন ইভেন্ট হ্যান্ডলিং, AOP, এবং আরও অনেক ফিচার। অন্যদিকে, BeanFactory একটি বেসিক IoC কনটেইনার যা Spring Framework এর প্রাথমিক সংস্করণে ব্যবহৃত হত এবং এখন বেশি ব্যবহার হয় না, কিন্তু এটি কিছু নির্দিষ্ট অবস্থানে, যেমন low-memory applications বা embedded systems-এ এখনও ব্যবহৃত হতে পারে।
স্প্রিং কনটেইনার (Spring Container) স্প্রিং ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ অংশ যা Bean তৈরি, কনফিগার এবং ম্যানেজ করার কাজ করে। স্প্রিং কনটেইনার একাধিক Bean (অবজেক্ট) তৈরি এবং ম্যানেজ করে এবং এসব Bean এর মধ্যে ডিপেনডেন্সি ইনজেকশন করে। স্প্রিং কনটেইনারের মাধ্যমে আপনি এসি প্রকল্পের অভ্যন্তরীণ লজিক এবং অবজেক্টগুলিকে সহজেই ম্যানেজ করতে পারেন, যা ডিপেনডেন্সি ইনজেকশন (DI) এবং অ্যাস্পেক্ট ওরিয়েন্টেড প্রোগ্রামিং (AOP) এর মাধ্যমে আপনার অ্যাপ্লিকেশনকে আরো নমনীয় ও স্কেলেবল করে তোলে।
স্প্রিং কনটেইনারের কাজের প্রক্রিয়া এবং এর উপাদান সম্পর্কে বিস্তারিত জানব।
স্প্রিং কনটেইনারের কাজের প্রক্রিয়া হলো:
XML
বা Java-based (অথবা Annotations ব্যবহার করে) করা যেতে পারে।স্প্রিং কনটেইনারের প্রধান দুটি উপাদান রয়েছে:
getBean()
মেথড দিয়ে Bean তৈরি করে এবং ম্যানেজ করে।ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean = (MyBean) context.getBean("myBean");
স্প্রিং কনটেইনারের কাজের প্রক্রিয়া তিনটি প্রধান ধাপে বিভক্ত:
স্প্রিং কনটেইনার প্রথমে সমস্ত Beans এর Definition তৈরি করে। এর মানে হচ্ছে যে স্প্রিং কনটেইনার জানে যে কোন ধরনের Bean তৈরি করতে হবে, সেই Bean এর নাম কী হবে, এবং কোন কনফিগারেশন ফাইলের মাধ্যমে Bean গুলি কনফিগার করতে হবে।
এটি XML
কনফিগারেশন ফাইল অথবা Java Config এর মাধ্যমে করা হয়।
XML Configuration Example:
<bean id="employeeService" class="com.example.EmployeeService">
<property name="employeeRepository" ref="employeeRepository"/>
</bean>
Java Config Example:
@Configuration
@ComponentScan("com.example")
public class AppConfig {
@Bean
public EmployeeService employeeService() {
return new EmployeeService();
}
}
স্প্রিং কনটেইনার তখন Bean Creation প্রক্রিয়া শুরু করে। যখন কনটেইনার তৈরি Bean এর জন্য নির্দিষ্ট কনফিগারেশন এবং ডিপেনডেন্সি ইনজেকশন করে, তখন এটি একটি অবজেক্ট তৈরি করে এবং সেই অবজেক্টকে কনটেইনারে নিবন্ধিত করে।
Singleton Scope Beans সাধারণত একটি সিঙ্গেল ইনস্ট্যান্স তৈরি করে এবং অ্যাপ্লিকেশন চলাকালীন সেটি ব্যবহার করা হয়।
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
}
এখানে, EmployeeService
একটি Bean
হিসাবে কনটেইনারে নিবন্ধিত হবে এবং EmployeeRepository
এর ডিপেনডেন্সি ইনজেকশন হবে।
স্প্রিং কনটেইনার Dependency Injection (DI) প্যাটার্ন অনুসরণ করে, যেখানে একটি Bean এর ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হয়। স্প্রিং মূলত তিনটি পদ্ধতিতে DI পরিচালনা করে:
Constructor Injection: ডিপেনডেন্সি কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়।
@Component
public class EmployeeService {
private final EmployeeRepository employeeRepository;
@Autowired
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
}
Setter Injection: ডিপেনডেন্সি সেটার মেথডের মাধ্যমে ইনজেক্ট করা হয়।
@Component
public class EmployeeService {
private EmployeeRepository employeeRepository;
@Autowired
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
}
Field Injection: ডিপেনডেন্সি সরাসরি ফিল্ডে ইনজেক্ট করা হয় (যা অনেকটা সহজ এবং কম ব্যবহৃত পদ্ধতি)।
@Component
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
}
স্প্রিং কনটেইনার যখন Beans তৈরি এবং ডিপেনডেন্সি ইনজেকশন শেষ করে, তখন Bean Initialization শুরু হয়। স্প্রিং কনটেইনার তখন @PostConstruct
অ্যানোটেশন বা InitializingBean ইন্টারফেস ব্যবহার করে Beans কে ইনিশিয়ালাইজ করে।
@Component
public class EmployeeService {
@PostConstruct
public void init() {
System.out.println("EmployeeService initialized");
}
}
অ্যাপ্লিকেশন বন্ধ হওয়ার পর স্প্রিং কনটেইনার Beans এর Destruction পরিচালনা করে। যদি কোনও Bean @PreDestroy
অ্যানোটেশন থাকে, তবে এটি Bean এর ডেস্ট্রাকশন প্রক্রিয়া পরিচালনা করবে। অথবা DisposableBean ইন্টারফেসও ব্যবহার করা যেতে পারে।
@Component
public class EmployeeService implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("EmployeeService destroyed");
}
}
স্প্রিং কনটেইনার হলো একটি জটিল এবং গুরুত্বপূর্ণ উপাদান যা পুরো অ্যাপ্লিকেশনের Bean Lifecycle পরিচালনা করে। এটি Bean Creation, Dependency Injection, Bean Initialization, এবং Bean Destruction এর মতো কাজের মাধ্যমে আপনার অ্যাপ্লিকেশনের ডিপেনডেন্সি এবং অবজেক্টগুলিকে দক্ষভাবে ম্যানেজ করে। স্প্রিং কনটেইনারের মাধ্যমে অ্যাপ্লিকেশনটি আরও নমনীয়, স্কেলেবল এবং মডুলার হয়।
Spring IoC (Inversion of Control) Container একটি মৌলিক ধারণা যা Spring Framework এর মূল ভিত্তি। IoC এর মাধ্যমে, Spring কনটেইনার আমাদের অ্যাপ্লিকেশনের অবজেক্টগুলিকে ম্যানেজ করে এবং তাদের মধ্যে Dependency Injection (DI) ব্যবহার করে একে অপরকে সংযুক্ত করে। এতে কোডের loose coupling সৃষ্টি হয় এবং flexibility বাড়ে।
Spring IoC কনটেইনার ম্যানেজ করে:
এখানে, আমরা Spring IoC Container এবং Dependency Injection (DI) এর ব্যবহার দেখাব, যাতে একটি প্রাথমিক Spring অ্যাপ্লিকেশন তৈরি করা যাবে।
Spring IoC কনটেইনার প্রধানত দুটি ধরণের হয়:
ApplicationContext কনটেইনার Bean এর কনফিগারেশন ও লোডিং, ইনস্ট্যান্সিয়েশন এবং Dependency Injection (DI) পরিচালনা করে। এটি Spring MVC, Spring AOP, এবং অন্যান্য Spring মডিউলগুলির জন্য গুরুত্বপূর্ণ।
এখানে একটি সাধারণ উদাহরণ দেওয়া হয়েছে যেখানে Spring IoC কনটেইনার ব্যবহার করে একটি EmployeeService Bean তৈরি করা হয়েছে এবং সেটিতে Dependency Injection প্রয়োগ করা হয়েছে।
প্রথমে, আমরা একটি EmployeeService ক্লাস তৈরি করব, যা একটি DepartmentService ক্লাসের উপর নির্ভরশীল।
package com.example.demo.service;
public class DepartmentService {
public void displayDepartment() {
System.out.println("This is the IT department.");
}
}
এখানে, DepartmentService একটি সিম্পল ক্লাস যা একটি মেথড displayDepartment() রাখে, যা একটি ডিপার্টমেন্টের নাম প্রিন্ট করবে।
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 ইনজেক্ট করা হয়েছে।
এখন, আমরা Spring IoC কনটেইনার কনফিগার করব এবং Spring কনটেইনার ব্যবহার করে EmployeeService এবং DepartmentService Bean ইনস্ট্যান্স করব।
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();
}
}
এখানে:
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
}
}
এখানে:
employeeService()
মেথডে DepartmentService Bean ইনজেক্ট করা হয়েছে।Spring IoC কনটেইনারে Bean কনফিগারেশন সাধারণত Java-based configuration এ করা হয়, তবে আপনি application.properties ফাইল ব্যবহার করেও কিছু কনফিগারেশন করতে পারেন।
যেমন, application.properties এ ক্যাশিং, ট্রান্সঅ্যাকশন কনফিগারেশন ইত্যাদি সেট করা যেতে পারে, তবে এই উদাহরণে এটি ব্যবহার করার প্রয়োজন নেই।
এখন, আপনার SpringIoCExample ক্লাস চালালে Spring IoC কনটেইনারের মাধ্যমে DepartmentService Bean ইনজেক্ট হবে এবং তারপর EmployeeService Bean মেথড কল করবে।
Employee details:
This is the IT department.
এখানে, EmployeeService মেথডে DepartmentService Bean ইনজেক্ট হয়ে, ডিপার্টমেন্টের নাম প্রিন্ট করছে।
Spring IoC Container এবং Dependency Injection (DI) ব্যবহার করে Spring Framework এর মাধ্যমে আমরা খুব সহজেই অ্যাপ্লিকেশনের Bean গুলি ম্যানেজ করতে পারি। IoC কনটেইনার Spring Bean গুলির ক্রিয়েশন, ম্যানেজমেন্ট এবং ডিপেনডেন্সি ইনজেকশন নিশ্চিত করে, যা কোডের loose coupling এবং maintainability বৃদ্ধি করে। এই উদাহরণে, আমরা দেখলাম কিভাবে EmployeeService এবং DepartmentService Bean তৈরি করা হয় এবং তাদের মধ্যে Dependency Injection বাস্তবায়িত হয়।
Read more