Spring Dependency Injection (DI) হলো Spring Framework-এর একটি মূল ধারণা যা অবজেক্টের মধ্যে ডিপেনডেন্সি অটোমেটিক্যালি ইনজেক্ট করতে সাহায্য করে। এর মাধ্যমে অ্যাপ্লিকেশন কোডকে আরও নমনীয়, টেস্টযোগ্য এবং রিইউজেবল করা সম্ভব হয়। Spring Framework Dependency Injection-এর জন্য IoC (Inversion of Control) কনটেইনার ব্যবহৃত হয়, যা Spring Beans পরিচালনা করে।
Spring Bean
Spring Bean হলো Spring IoC কনটেইনারের মধ্যে একটি অবজেক্ট যা Spring অ্যাপ্লিকেশনে ব্যবহৃত হয়। Spring Bean কনফিগারেশন ফাইল বা অ্যানোটেশন ব্যবহার করে ডিফাইন করা হয় এবং Spring কনটেইনার দ্বারা ব্যবস্থাপনা করা হয়।
Spring Bean এর বৈশিষ্ট্য:
- Managed by Spring Container: Spring Bean কনটেইনার দ্বারা তৈরি এবং পরিচালিত হয়।
- Instantiation: Spring কনটেইনার Bean-এর ইন্সট্যান্স তৈরি করে এবং যেকোনো ডিপেনডেন্সি অটোমেটিক্যালি ইনজেক্ট করে।
- Scope: Spring Bean-এর স্কোপ নির্ধারণ করা যায়, যেমন Singleton, Prototype, Request, Session, Application ইত্যাদি।
উদাহরণ: Spring Bean ডিফাইন করা
- XML কনফিগারেশন:
<bean id="employee" class="com.example.Employee">
<property name="name" value="John Doe"/>
<property name="position" value="Developer"/>
</bean>
- অ্যানোটেশন কনফিগারেশন:
@Component
public class Employee {
private String name;
private String position;
// Getters এবং Setters
}
এখানে, Employee একটি Spring Bean যা Spring কনটেইনার দ্বারা ব্যবস্থাপিত হবে।
IoC Container
IoC (Inversion of Control) Container হল একটি কনটেইনার যা Spring Framework-এ অবজেক্টের লাইফসাইকেল এবং ডিপেনডেন্সি ইনজেকশন (DI) পরিচালনা করে। IoC কনটেইনার Spring Beans তৈরি এবং পরিচালনা করে এবং যখনই কোন Bean প্রয়োজন হয়, তখন তা ইনস্ট্যানশিয়েট করে ডিপেনডেন্সি ইনজেক্ট করে দেয়।
IoC Container-এর দুটি প্রধান ধরনের:
- BeanFactory: এটি Spring Framework-এর সবচেয়ে সহজ IoC কনটেইনার, যা লেজি লোডিং (lazy loading) সমর্থন করে এবং Bean গুলি কেবল তখনই তৈরি হয় যখন তা প্রয়োজন হয়।
- ApplicationContext: এটি
BeanFactoryথেকে আরো উন্নত কনটেইনার, যা আরও অনেক ফিচার সরবরাহ করে যেমন ইন্টারন্যাশনালাইজেশন, ইভেন্ট ম্যানেজমেন্ট, AOP, এবং আরও অনেক কিছু।
উদাহরণ: ApplicationContext ব্যবহার
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Employee employee = context.getBean("employee", Employee.class);
এখানে, ClassPathXmlApplicationContext কনটেইনার Spring কনফিগারেশন ফাইল (beans.xml) লোড করে এবং তার মধ্যে থাকা Bean গুলোকে ম্যানেজ করে।
Dependency Injection (DI) কিভাবে কাজ করে?
Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা Spring Bean-এ ডিপেনডেন্সি ইনজেক্ট করে। Spring IoC কনটেইনার Bean-এ প্রয়োজনীয় ডিপেনডেন্সি ইনজেক্ট করে, যাতে কোডের মধ্যে ডিপেনডেন্সির প্রাচীনতা বা প্রয়োজনীয়তা নিজে থেকে ম্যানেজ না করতে হয়।
DI-এর দুটি প্রধান পদ্ধতি:
- Setter Injection: ডিপেনডেন্সি সেট করার জন্য
setterমেথড ব্যবহার করা হয়। - Constructor Injection: ডিপেনডেন্সি ইনজেক্ট করার জন্য কন্সট্রাকটর ব্যবহার করা হয়।
১. Setter Injection:
@Component
public class Employee {
private String name;
private String position;
@Autowired
public void setName(String name) {
this.name = name;
}
@Autowired
public void setPosition(String position) {
this.position = position;
}
// Getters এবং Setters
}
এখানে, name এবং position প্রপার্টির জন্য setter মেথড ব্যবহার করে ইনজেক্ট করা হয়েছে।
২. Constructor Injection:
@Component
public class Employee {
private String name;
private String position;
@Autowired
public Employee(String name, String position) {
this.name = name;
this.position = position;
}
// Getters এবং Setters
}
এখানে, কন্সট্রাকটর ইনজেকশন ব্যবহার করা হয়েছে, যেখানে ডিপেনডেন্সি কন্সট্রাকটরের মাধ্যমে ইনজেক্ট করা হয়।
Spring IoC Container এবং Bean এর উপকারিতা
- Loose Coupling: Spring DI ব্যবহারের মাধ্যমে অবজেক্টগুলির মধ্যে টাইট কপলিং কমানো যায়, যার ফলে কোড সহজভাবে টেস্ট করা এবং রিইউজ করা সম্ভব হয়।
- Flexibility: Spring Bean গুলি ডাইনামিকভাবে কনফিগার করা যায়, যা অ্যাপ্লিকেশনকে আরও নমনীয় করে তোলে।
- Testability: DI ব্যবহারের ফলে টেস্টিং সহজ হয়ে ওঠে কারণ নির্ভরশীলতা সরবরাহকারী (dependency provider) ইনস্ট্যানশিয়েট করা যায়।
- Centralized Configuration: Spring IoC কনটেইনার সমস্ত Bean-এর কনফিগারেশন কেন্দ্রীভূতভাবে পরিচালনা করে, যা কনফিগারেশন ও মেইনটেনেন্স সহজ করে।
সারাংশ
Spring Bean হলো Spring IoC কনটেইনার দ্বারা ব্যবস্থাপিত একটি অবজেক্ট, এবং IoC Container হলো সেই কনটেইনার যা Spring Beans এবং তাদের ডিপেনডেন্সি ইনজেক্ট করার জন্য ব্যবহৃত হয়। Spring DI ব্যবহার করে অবজেক্টগুলির মধ্যে সম্পর্ক ও ডিপেনডেন্সি ইনজেক্ট করা হয়, যাতে কোড আরও নমনীয়, টেস্টেবল এবং সহজে রিইউজযোগ্য হয়। Spring-এর IoC কনটেইনার দুটি প্রধান ধরনের: BeanFactory এবং ApplicationContext, যেখানে ApplicationContext আরও উন্নত এবং পূর্ণাঙ্গ সমাধান প্রদান করে।
স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশন (Dependency Injection - DI) একটি কোর কনসেপ্ট, যা স্প্রিং কনটেইনারের মাধ্যমে অবজেক্টগুলি তৈরি এবং ইনজেক্ট করার প্রক্রিয়া। এই প্রক্রিয়া কোডের নমনীয়তা, টেস্টেবিলিটি এবং মডুলারিটি বাড়ানোর জন্য ব্যবহৃত হয়। Bean হলো স্প্রিং কনটেইনারে পরিচালিত অবজেক্ট যা ডিপেনডেন্সি ইনজেকশন দ্বারা ব্যবস্থাপনা করা হয়।
Bean কী?
স্প্রিং কনটেইনারে যে অবজেক্টটি তৈরি ও ম্যানেজ করা হয়, তাকে Bean বলা হয়। একটি Bean সাধারণত একটি ক্লাসের ইন্সট্যান্স, যা স্প্রিং কনটেইনারের মাধ্যমে ডিপেনডেন্সি ইনজেকশন প্রক্রিয়া দ্বারা ইনজেক্ট করা হয় এবং এটি স্প্রিং ফ্রেমওয়ার্কের ব্যবস্থাপনা অধীনে থাকে।
স্প্রিং কনটেইনারে Beans সাধারণত XML কনফিগারেশন, অ্যনোটেশন, অথবা Java-based Configuration এর মাধ্যমে রেজিস্টার করা হয়।
Bean এর ভূমিকা
Bean স্প্রিং কনটেইনারের মধ্যে একটি অবজেক্ট যা তৈরি হয় এবং পরিচালিত হয়। এর ভূমিকা অনেক গুরুত্বপূর্ণ:
- ডিপেনডেন্সি ইনজেকশন: স্প্রিং কনটেইনার Bean গুলি তৈরি করে এবং তাদের মধ্যে ডিপেনডেন্সি ইনজেক্ট করে, যাতে অবজেক্টগুলোর মধ্যে সম্পর্ক এবং ইন্টারঅ্যাকশন সহজে পরিচালিত হয়।
- লাইফ সাইকেল ম্যানেজমেন্ট: স্প্রিং কনটেইনার Beans এর লাইফ সাইকেল পরিচালনা করে। Bean এর তৈরি, স্টার্ট, ডেস্ট্রয় এবং অন্যান্য স্টেটস স্প্রিং কনটেইনার ম্যানেজ করে।
- কনফিগারেশন এবং প্রোপার্টি ইনজেকশন: স্প্রিং কনটেইনার Beans এর কনফিগারেশন এবং প্রোপার্টি ইনজেক্ট করে। এক্সটার্নাল কনফিগারেশন (যেমন
application.propertiesঅথবা XML) ব্যবহার করে Beans কনফিগার করা যায়।
স্প্রিং কনটেইনারে Bean কিভাবে তৈরি হয়?
স্প্রিং কনটেইনারে Beans তৈরি এবং ম্যানেজ করার জন্য বিভিন্ন কৌশল ব্যবহৃত হয়:
- XML কনফিগারেশন: স্প্রিং কনটেইনারে Beans কনফিগার করার পুরনো পদ্ধতি।
- অ্যানোটেশন কনফিগারেশন: নতুন পদ্ধতি যেখানে স্প্রিং অ্যানোটেশন ব্যবহার করে Bean কনফিগার করা হয়।
- Java-based Configuration: স্প্রিং 3 এর পরে Java কোডের মাধ্যমে কনফিগারেশন করা যেতে পারে, যেখানে
@Configurationএবং@Beanঅ্যানোটেশন ব্যবহার করা হয়।
উদাহরণ সহ Bean এর ব্যবহার
১. XML কনফিগারেশন দ্বারা Bean তৈরি
<!-- Spring configuration file (beans.xml) -->
<bean id="employee" class="com.example.Employee">
<property name="name" value="John Doe"/>
<property name="department" value="Engineering"/>
</bean>
এখানে, employee Bean একটি Employee ক্লাসের ইনস্ট্যান্স, এবং এর প্রোপার্টি name এবং department স্প্রিং কনটেইনার দ্বারা ইনজেক্ট করা হয়েছে।
২. অ্যানোটেশন কনফিগারেশন দ্বারা Bean তৈরি
@Component
public class Employee {
private String name;
private String department;
// Getter and Setter methods
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
@Configuration
@ComponentScan("com.example")
public class AppConfig {
// Configuration class to scan and create Beans
}
এখানে, @Component অ্যানোটেশন দ্বারা Employee ক্লাসটিকে Bean হিসেবে চিহ্নিত করা হয়েছে। @ComponentScan অ্যানোটেশন দ্বারা স্প্রিং কনটেইনারকে com.example প্যাকেজে থাকা সকল Bean এর জন্য স্ক্যান করতে বলা হয়েছে।
৩. Java-based Configuration দ্বারা Bean তৈরি
@Configuration
public class AppConfig {
@Bean
public Employee employee() {
Employee employee = new Employee();
employee.setName("John Doe");
employee.setDepartment("Engineering");
return employee;
}
}
এখানে, @Configuration এবং @Bean অ্যানোটেশন ব্যবহার করে Employee Bean তৈরি করা হয়েছে। @Bean মেথড স্প্রিং কনটেইনারকে এই মেথডটির রিটার্ন ভ্যালু হিসেবে একটি Bean তৈরি করতে বলে।
Bean লাইফ সাইকেল
স্প্রিং Bean এর লাইফ সাইকেল স্প্রিং কনটেইনার দ্বারা পরিচালিত হয়। এটি Bean এর তৈরি, প্রাথমিককরণ, ব্যবহারের সময় এবং ধ্বংসের সময়ের মধ্যে বিভিন্ন পর্যায়ে কাজ করে।
- Bean Creation: স্প্রিং কনটেইনার Bean তৈরি করে।
- Dependency Injection: Bean এর প্রোপার্টি বা ডিপেনডেন্সি ইনজেক্ট করা হয়।
- Post-Initialization: Bean তৈরি হওয়ার পর কোনো
@PostConstructবাinit-methodব্যবহৃত হতে পারে। - Bean Destruction: Bean ধ্বংসের সময়, কোনো
@PreDestroyবাdestroy-methodকল হতে পারে।
Bean এর ভূমিকা স্প্রিং ডিপেনডেন্সি ইনজেকশনে
- ডিপেনডেন্সি ইনজেকশন: স্প্রিং ডিপেনডেন্সি ইনজেকশন (DI) প্যাটার্ন অনুসরণ করে, স্প্রিং কনটেইনার একটি Bean এর প্রয়োজনীয় ডিপেনডেন্সি ইনজেক্ট করে। এর মাধ্যমে অবজেক্টের মধ্যে লোশ-কপলিং (loose coupling) তৈরি হয়, অর্থাৎ ডিপেনডেন্সিগুলি Bean এর মধ্যে সরাসরি না হয়ে, স্প্রিং কনটেইনার দ্বারা ইনজেক্ট করা হয়।
- কনফিগারেশন ম্যানেজমেন্ট: স্প্রিং কনটেইনার Bean গুলির কনফিগারেশন ম্যানেজ করে। এটি প্রোপার্টি ফাইল বা XML ফাইলের মাধ্যমে Bean গুলির মান নির্ধারণ করতে পারে।
- লাইফ সাইকেল ম্যানেজমেন্ট: স্প্রিং কনটেইনার Bean এর লাইফ সাইকেল পরিচালনা করে, যেমন Bean তৈরি, প্রাথমিককরণ, ধ্বংস ইত্যাদি।
উপসংহার
Bean স্প্রিং কনটেইনারে ব্যবস্থাপনা করা অবজেক্ট, যা স্প্রিং ফ্রেমওয়ার্কের মূল উপাদান। ডিপেনডেন্সি ইনজেকশনের মাধ্যমে Bean গুলির মধ্যে সম্পর্ক তৈরি করা হয় এবং কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা বাড়ানো হয়। স্প্রিং কনটেইনার Bean এর লাইফ সাইকেল পরিচালনা করে এবং ডিপেনডেন্সি ইনজেকশনের মাধ্যমে অবজেক্টগুলোকে স্বয়ংক্রিয়ভাবে ইন্সট্যান্সিয়েট এবং ইনজেক্ট করে। স্প্রিং Bean কনফিগারেশন বিভিন্ন পদ্ধতিতে করা যায় যেমন XML, অ্যানোটেশন, এবং Java-based Configuration।
Spring IoC Container (Inversion of Control Container) হল Spring Framework-এর একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান যা অ্যাপ্লিকেশন কম্পোনেন্টগুলির লাইফ সাইকেল ম্যানেজ করতে সাহায্য করে। IoC Container ডিপেনডেন্সি ইনজেকশন (DI) এবং অবজেক্ট ক্রিয়েশনসহ অনেক গুরুত্বপূর্ণ কার্যক্রম পরিচালনা করে। এর মাধ্যমে Spring অ্যাপ্লিকেশনগুলির মধ্যে অবজেক্ট তৈরি এবং তাদের মধ্যে সম্পর্ক স্থাপন করা হয়, যা কমপ্লেক্স অ্যাপ্লিকেশন ডেভেলপমেন্টকে সহজ ও মডুলার করে তোলে।
Spring IoC Container এর কার্যপ্রণালী
1. Inversion of Control (IoC) Principle
Inversion of Control (IoC) একটি ডিজাইন প্যাটার্ন যেখানে অ্যাপ্লিকেশন কোডের নিয়ন্ত্রণ ইনস্ট্যান্সের তৈরি এবং তার ডিপেনডেন্সি ম্যানেজমেন্টের জন্য বাহ্যিক একটি কন্টেনারের হাতে ছেড়ে দেওয়া হয়। Spring Framework IoC ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশনকে অনেক বেশি মডুলার এবং নমনীয় করে তোলে।
সাধারণভাবে, ডিপেনডেন্সি ইনজেকশন (DI) হল IoC-এর একটি বাস্তবায়ন, যেখানে Spring IoC Container স্বয়ংক্রিয়ভাবে অবজেক্টগুলির ডিপেনডেন্সি প্রদান করে।
2. Spring IoC Container কীভাবে কাজ করে?
Spring IoC Container মূলত দুটি গুরুত্বপূর্ণ কাজ করে:
- Bean Definition: কন্টেইনারকে জানানো যে কোন অবজেক্ট বা Bean তৈরি করতে হবে এবং সেই Beans-এর প্রপার্টি কীভাবে সেট করতে হবে।
- Dependency Injection: কন্টেইনার ডিপেনডেন্সি ইনজেকশনের মাধ্যমে নির্দিষ্ট Beans-এর মধ্যে সম্পর্ক স্থাপন করে।
এই দুইটি কাজ ApplicationContext বা BeanFactory কন্টেইনারের মাধ্যমে সম্পন্ন করা হয়।
Spring IoC Container-এর দুটি প্রধান ধরনের কন্টেইনার:
- BeanFactory: এটি Spring IoC কন্টেইনারের একটি প্রাথমিক ভার্সন, যা শুধুমাত্র Bean এর প্রাথমিক ইনস্ট্যান্স তৈরি এবং ম্যানেজ করে।
- ApplicationContext: এটি BeanFactory এর একটি উন্নত ভার্সন, যা Bean তৈরি ছাড়াও বিভিন্ন অতিরিক্ত ফিচার যেমন ইভেন্ট ম্যানেজমেন্ট, আন্তর্জাতিককরণ (Internationalization) এবং Bean লাইফসাইকেল হুকস প্রদান করে।
3. Spring IoC Container-এর কাজের ধাপ
3.1 Bean Configuration (Bean Definition)
Spring IoC কন্টেইনার প্রথমে একটি Bean Configuration ফাইল (যেমন XML ফাইল বা Java Config ক্লাস) লোড করে, যেখানে সকল Bean ডেফিনেশন থাকবে। Spring IoC Container এই কনফিগারেশন ফাইলটি পড়ে এবং সেই অনুযায়ী Beans তৈরি করে।
3.2 Bean Creation and Dependency Injection
প্রতিটি Bean তৈরি হওয়ার পর, dependency injection (DI) প্রক্রিয়া শুরু হয়। এখানে কন্টেইনার ইনজেক্ট করে dependencies সেই Beans এর মধ্যে। এটি constructor injection, setter injection, বা field injection এর মাধ্যমে হতে পারে।
4. Spring IoC Container-এর উদাহরণ
4.1 XML Configuration Example
Step 1: Bean Definition in 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">
<!-- Define a bean of type 'Car' -->
<bean id="car" class="com.example.Car">
<property name="make" value="Toyota"/>
<property name="model" value="Camry"/>
</bean>
</beans>
Step 2: Spring Bean Class
public class Car {
private String make;
private String model;
// Getters and Setters
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public void displayDetails() {
System.out.println("Car Make: " + make + ", Model: " + model);
}
}
Step 3: Main Application Class to Load Spring Container
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
// Load Spring IoC Container
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// Retrieve the car bean from the container
Car car = (Car) context.getBean("car");
car.displayDetails(); // Output: Car Make: Toyota, Model: Camry
}
}
এই উদাহরণে, ApplicationContext একটি bean এর ডেফিনেশন থেকে ডিপেনডেন্সি ইনজেকশন এবং Bean তৈরির কাজ করে।
5. Types of Dependency Injection
Spring IoC Container বিভিন্ন ধরনের ডিপেনডেন্সি ইনজেকশন প্রয়োগ করতে পারে:
- Constructor Injection: ডিপেনডেন্সি ইনজেকশন কনস্ট্রাক্টরের মাধ্যমে করা হয়।
- Setter Injection: ডিপেনডেন্সি ইনজেকশন সেটার মেথডের মাধ্যমে করা হয়।
- Field Injection: ডিপেনডেন্সি ইনজেকশন সরাসরি ফিল্ডে করা হয়।
Example: Constructor Injection
public class Car {
private Engine engine;
// Constructor Injection
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.run();
}
}
Example: Setter Injection
public class Car {
private Engine engine;
// Setter Injection
public void setEngine(Engine engine) {
this.engine = engine;
}
public void start() {
engine.run();
}
}
সারাংশ
Spring IoC Container হল Spring Framework-এর মূল উপাদান যা অ্যাপ্লিকেশন অবজেক্টগুলির জীবনচক্র পরিচালনা করে। এটি Spring Beans তৈরি এবং তাদের মধ্যে ডিপেনডেন্সি ইনজেকশন সম্পাদন করে, যা অ্যাপ্লিকেশনকে নমনীয়, মডুলার এবং রিডাবল করা সহজ করে তোলে। Spring IoC Container-এর মাধ্যমে dependency injection প্রক্রিয়া সহজ এবং পরিচালনাযোগ্য হয়, যা Spring অ্যাপ্লিকেশনগুলির মধ্যে কোডের পুনঃব্যবহারযোগ্যতা ও টেস্টেবিলিটি বাড়ায়।
Spring Framework-এ Dependency Injection (DI) একটি মৌলিক ধারণা, যা Spring IoC (Inversion of Control) কনটেইনারের মাধ্যমে নির্ধারিত হয়। Bean Lifecycle এবং Bean Scope ডিপেনডেন্সি ইনজেকশনের গুরুত্বপূর্ণ অংশ যা Spring Bean-কে কিভাবে তৈরি, ব্যবস্থাপনা এবং ধ্বংস করা হয়, এবং Bean-এর প্রেক্ষাপটে তার অস্তিত্বের পরিধি কী হবে, তা নির্ধারণ করে।
Bean Lifecycle
Spring Bean Lifecycle বলতে, Spring IoC কনটেইনারের মধ্যে একটি Bean তৈরি, ব্যবহার এবং ধ্বংস হওয়া পর্যন্ত যে সমস্ত ধাপ অনুসরণ করা হয়, তাকে বুঝায়। Spring Bean Lifecycle সাধারণত নিম্নলিখিত স্টেপগুলোর মধ্যে চলে:
১. Bean Instantiation (Bean সৃষ্টি)
Spring কনটেইনার Bean ক্লাসের জন্য একটি নতুন অবজেক্ট তৈরি করে। এটি Bean Definition-এ নির্দেশিত কনস্ট্রাক্টর বা ফ্যাক্টরি মেথড ব্যবহার করে করা হয়।
২. Dependency Injection (ডিপেনডেন্সি ইনজেকশন)
Spring কনটেইনারের মাধ্যমে Bean এর ডিপেনডেন্সি (অন্য Bean বা প্রপার্টি) সেট করা হয়। এটি Constructor Injection, Setter Injection অথবা Field Injection এর মাধ্যমে করা যেতে পারে।
৩. Post-Processing (Post-Processing)
যখন Bean তৈরি হয়ে যায় এবং তার ডিপেনডেন্সি ইনজেক্ট করা হয়, তখন BeanPostProcessor ইন্টারফেসের মাধ্যমে Bean-এর উপর অতিরিক্ত প্রসেসিং বা কাস্টমাইজেশন করা যেতে পারে। উদাহরণস্বরূপ, একটি Bean এর প্রপার্টি বা স্টেট পরিবর্তন করা।
৪. Initialization (ইনিশিয়ালাইজেশন)
এটি একটি Bean এর ইনিশিয়াল স্টেট সেট করার প্রক্রিয়া। Spring Bean initialization করার জন্য @PostConstruct অ্যানোটেশন অথবা XML কনফিগারেশনের মধ্যে init-method প্যারামিটার ব্যবহার করতে পারে। এই সময় বিভিন্ন এক্সট্রা কনফিগারেশন যেমন, কনফিগারেশন ফাইল লোড করা অথবা ডাটাবেস কানেকশন স্থাপন করা হয়।
৫. Bean Destruction (ধ্বংস)
Bean এর জীবন শেষ হলে Spring কনটেইনার Bean কে ধ্বংস করে, যাতে রিসোর্স ফ্রি করা যায়। এটি @PreDestroy অ্যানোটেশন অথবা XML কনফিগারেশনে destroy-method প্যারামিটার ব্যবহার করে করা যেতে পারে। Bean destruction এর সময় রিসোর্স ক্লোজিং, ক্লিন-আপ ইত্যাদি কাজ করা হয়।
Bean Lifecycle Flow
- Bean Instantiation: Spring কনটেইনার Bean এর ইনস্ট্যান্স তৈরি করে।
- Dependency Injection: কনটেইনার Bean-এ তার ডিপেনডেন্সি ইনজেক্ট করে।
- Post-Processing: BeanPostProcessor এর মাধ্যমে কোনো কাস্টম প্রসেসিং করা হয়।
- Initialization: ইনিশিয়ালাইজেশন মেথড কল করা হয়।
- Usage: Bean ব্যবহৃত হয়।
- Destruction: Bean ধ্বংস করা হয় এবং রিসোর্স ক্লিন-আপ করা হয়।
Bean Scope
Spring Framework-এ Bean-এর Scope হলো একটি Bean এর জীবনকাল এবং তার অস্তিত্বের পরিধি। Spring বিভিন্ন ধরনের Bean Scope সাপোর্ট করে, যার মাধ্যমে আপনি কন্ট্রোল করতে পারেন একটি Bean কতটুকু সময় ধরে কনটেইনারে থাকবে।
১. Singleton Scope (ডিফল্ট Scope)
এটি Spring Framework-এ ডিফল্ট Bean Scope। Singleton scope-এ একটি Bean কনটেইনারের মধ্যে শুধুমাত্র একটি ইনস্ট্যান্স তৈরি হয় এবং সেটি পুরো অ্যাপ্লিকেশনে শেয়ার করা হয়। একটি Bean শুধুমাত্র একবার তৈরি হয় এবং কনটেইনার থেকে বারবার ব্যবহার করা হয়।
- বর্ণনা: প্রতিটি অ্যাপ্লিকেশন রানটাইমে শুধুমাত্র একটি Bean ইনস্ট্যান্স।
- ব্যবহার: যেসব Bean শুধুমাত্র একবার তৈরি হতে হবে এবং পুনরায় ব্যবহার করতে হবে।
@Component
public class MyBean {
// Singleton Scope, একমাত্র একটি Bean ইনস্ট্যান্স থাকবে।
}
২. Prototype Scope
Prototype scope-এ, Spring কনটেইনার প্রতিবার একটি Bean রিকোয়েস্টের জন্য নতুন ইনস্ট্যান্স তৈরি করে। এর মানে হলো প্রতিটি Bean রিকোয়েস্টের জন্য একটি নতুন Bean তৈরি হবে।
- বর্ণনা: প্রতিবার Bean এর জন্য নতুন ইনস্ট্যান্স তৈরি হয়।
- ব্যবহার: যেসব Bean প্রতি ব্যবহার বা রিকোয়েস্টে নতুন ইনস্ট্যান্স প্রয়োজন।
@Component
@Scope("prototype")
public class MyBean {
// Prototype Scope, প্রতিবার নতুন Bean ইনস্ট্যান্স তৈরি হবে।
}
৩. Request Scope
Request scope শুধুমাত্র HTTP রিকোয়েস্টের জন্য ব্যবহার করা হয়। প্রতিটি HTTP রিকোয়েস্টে একটি নতুন Bean তৈরি হয় এবং রিকোয়েস্টের শেষ হওয়া পর্যন্ত তার অস্তিত্ব থাকে।
- বর্ণনা: প্রতি HTTP রিকোয়েস্টে একটি নতুন Bean তৈরি হয়।
- ব্যবহার: ওয়েব অ্যাপ্লিকেশনগুলিতে যেগুলি প্রতিটি HTTP রিকোয়েস্টের জন্য একটি নতুন Bean চান।
@Component
@Scope("request")
public class MyBean {
// Request Scope, প্রতি HTTP রিকোয়েস্টে নতুন Bean তৈরি হবে।
}
৪. Session Scope
Session scope HTTP সেশন অনুযায়ী কাজ করে। প্রতিটি HTTP সেশনের জন্য একটি Bean তৈরি হয় এবং সেশন শেষ হওয়ার পর সেই Bean ধ্বংস হয়।
- বর্ণনা: প্রতি HTTP সেশনে একটি নতুন Bean তৈরি হয়।
- ব্যবহার: সেশন ভিত্তিক ডেটা রাখা।
@Component
@Scope("session")
public class MyBean {
// Session Scope, প্রতি HTTP সেশনে একটি নতুন Bean তৈরি হবে।
}
৫. Application Scope
Application scope Bean অ্যাপ্লিকেশন পর্যায়ে অ্যাক্সেসযোগ্য থাকে, মানে এটি একবার তৈরি হলে অ্যাপ্লিকেশন চলাকালীন সময় এটি শেয়ার করা হয় এবং কোনো HTTP রিকোয়েস্টের সাথে সম্পর্কিত থাকে না।
- বর্ণনা: অ্যাপ্লিকেশন চলাকালীন একমাত্র একটি Bean ইনস্ট্যান্স থাকে।
- ব্যবহার: ওয়েব অ্যাপ্লিকেশন যেখানে একটি Bean একাধিক সেশন বা রিকোয়েস্টে শেয়ার করা হয়।
@Component
@Scope("application")
public class MyBean {
// Application Scope, অ্যাপ্লিকেশন চলাকালীন একটি Bean ইনস্ট্যান্স থাকবে।
}
৬. Websocket Scope
Spring 4.0 থেকে Websocket scope যোগ করা হয়েছে। এটি শুধুমাত্র WebSocket সেশন ভিত্তিক। যখন WebSocket সেশন শুরু হয়, তখন Bean তৈরি হয় এবং WebSocket সেশন শেষ হলে Bean ধ্বংস হয়।
- বর্ণনা: WebSocket সেশন ভিত্তিক Bean তৈরি হয়।
- ব্যবহার: WebSocket ভিত্তিক অ্যাপ্লিকেশনগুলিতে।
@Component
@Scope("websocket")
public class MyBean {
// WebSocket Scope, WebSocket সেশন ভিত্তিক।
}
সারাংশ
- Bean Lifecycle: Spring Bean Lifecycle Bean এর তৈরি, ব্যবহার এবং ধ্বংসের প্রক্রিয়া নিয়ন্ত্রণ করে। এটি Spring IoC কনটেইনারের মাধ্যমে হয়, এবং বিভিন্ন ধাপে Bean Post-Processors, Initialization, এবং Destruction Methods ব্যবহৃত হয়।
- Bean Scope: Spring Bean Scope ডিপেন্ড করে Bean এর অস্তিত্বের পরিধি এবং জীবনকাল কেমন হবে। Singleton, Prototype, Request, Session, Application এবং Websocket সেগুলোর প্রধান ধরন।
Spring Dependency Injection এবং Bean Lifecycle এর মাধ্যমে Spring Framework একটি অত্যন্ত নমনীয় এবং কার্যকরী কনটেইনার তৈরি করে, যা ডিপেনডেন্সি ম্যানেজমেন্ট এবং অ্যাপ্লিকেশন কনফিগারেশনকে সহজ করে।
Spring Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা কম্পোনেন্ট বা ক্লাসগুলির মধ্যে ডিপেনডেন্সি (নির্ভরতাগুলি) সরাসরি ইনজেক্ট করার প্রক্রিয়া। Spring Framework DI ব্যবহার করে, আপনাকে ক্লাসগুলির মধ্যে ডিপেনডেন্সি ম্যানুয়ালি সেট করতে হয় না, বরং Spring নিজেই তা পরিচালনা করে। এটি একটি গুরুত্বপূর্ণ সুবিধা, কারণ এটি কোডের পঠনযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি করে এবং ক্লাসগুলির মধ্যে আলাদা সিমেন্ট তৈরি করে।
Spring Bean এবং Container হল Spring Framework-এ DI ব্যবস্থাপনা করার জন্য অপরিহার্য অংশ।
Spring Bean
Spring Bean হল Spring IoC (Inversion of Control) Container দ্বারা পরিচালিত Java অবজেক্ট। এগুলি Spring-এর মধ্যে ব্যবহৃত কনফিগারেশন এবং ডিপেনডেন্সি ইনজেকশন (DI) মেকানিজমে অন্তর্ভুক্ত হয়। Spring Bean একবার তৈরি হলে Spring Container এ সংরক্ষিত থাকে এবং প্রয়োজনে ব্যবহার করা হয়।
Spring Bean তৈরি করার দুটি প্রধান উপায়:
- XML কনফিগারেশন
- Annotation-based কনফিগারেশন (যেটি আধুনিক Spring ব্যবহারে বেশি ব্যবহৃত)
উদাহরণ ১: Spring Bean এবং Container (Annotation-based)
Spring Bean তৈরি করতে এবং Dependency Injection (DI) বাস্তবায়ন করতে আমরা সাধারণত @Component, @Autowired অ্যানোটেশন ব্যবহার করি। এখানে @Component ব্যবহার করা হয়েছে Spring Bean হিসেবে চিহ্নিত করার জন্য এবং @Autowired ব্যবহার করা হয়েছে DI (ডিপেনডেন্সি ইনজেকশন) এর জন্য।
Step 1: Spring Bean তৈরি করা
import org.springframework.stereotype.Component;
@Component
public class ProductService {
public void showProductDetails() {
System.out.println("Product Details: Spring Dependency Injection Example");
}
}
এখানে ProductService ক্লাসটি Spring Bean হিসেবে চিহ্নিত করা হয়েছে @Component অ্যানোটেশন দিয়ে।
Step 2: Spring Bean Inject করা (DI ব্যবহার করা)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ProductController {
private final ProductService productService;
// Constructor-based Dependency Injection (DI)
@Autowired
public ProductController(ProductService productService) {
this.productService = productService;
}
public void displayProduct() {
productService.showProductDetails();
}
}
এখানে ProductController ক্লাসে ProductService Bean ইনজেক্ট করা হয়েছে Constructor-based Dependency Injection এর মাধ্যমে।
Step 3: Spring Container তৈরি করা
Spring Container তৈরি করতে এবং Bean গুলি পরিচালনা করতে AnnotationConfigApplicationContext ব্যবহার করা হয়। Spring Container Bean গুলি তৈরি এবং DI সম্পাদন করে।
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringDIExample {
public static void main(String[] args) {
// Spring Container তৈরি
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProductService.class, ProductController.class);
// ProductController Bean ইনস্ট্যান্স রিট্রাইভ করা
ProductController productController = context.getBean(ProductController.class);
// ProductController এর মেথড কল
productController.displayProduct();
// Container বন্ধ করা
context.close();
}
}
এখানে AnnotationConfigApplicationContext ব্যবহার করে Spring Container তৈরি করা হয়েছে, এবং ProductController Bean কে রিট্রাইভ করা হয়েছে, যেখানে ProductService Bean ইনজেক্ট হয়েছে।
উদাহরণ ২: Spring Bean XML কনফিগারেশন
XML কনফিগারেশন ব্যবহার করে Bean তৈরি করা এবং DI ইনজেকশন সম্পাদন করা যায়। তবে এটি বর্তমানে কম ব্যবহৃত হচ্ছে, কারণ Annotation-based কনফিগারেশন বেশি সহজ এবং আধুনিক।
Step 1: Spring Bean XML কনফিগারেশন
applicationContext.xml ফাইলে Bean কনফিগারেশন করা হয়।
<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 id="productService" class="com.example.ProductService"/>
<bean id="productController" class="com.example.ProductController">
<constructor-arg ref="productService"/>
</bean>
</beans>
এখানে productService এবং productController Bean কনফিগার করা হয়েছে। productController Bean এর কনস্ট্রাকটরে productService Bean ইনজেক্ট করা হয়েছে।
Step 2: Spring Container থেকে Bean রিট্রাইভ করা
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringDIExample {
public static void main(String[] args) {
// Spring Container তৈরি
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// ProductController Bean ইনস্ট্যান্স রিট্রাইভ করা
ProductController productController = (ProductController) context.getBean("productController");
// ProductController এর মেথড কল
productController.displayProduct();
// Container বন্ধ করা
((ClassPathXmlApplicationContext) context).close();
}
}
এখানে ClassPathXmlApplicationContext ব্যবহার করে XML কনফিগারেশন থেকে Bean রিট্রাইভ করা হয়েছে এবং DI সম্পাদিত হয়েছে।
Spring Container
Spring Container হল Spring Framework-এর একটি গুরুত্বপূর্ণ অংশ যা Spring Beans পরিচালনা করে। Spring Container Bean গুলি তৈরি করে এবং প্রয়োজনমতো তাদের মধ্যে ডিপেনডেন্সি ইনজেকশন (DI) প্রয়োগ করে। Spring Container বিভিন্ন ধরনের হতে পারে, যার মধ্যে সবচেয়ে প্রচলিত হল ApplicationContext এবং BeanFactory।
১. ApplicationContext:
- এটি Spring Container এর একটি উন্নত সংস্করণ যা Bean lifecycle এবং event-handling সহ অনেক সুবিধা প্রদান করে।
- ApplicationContext এর উদাহরণ হিসেবে ClassPathXmlApplicationContext, AnnotationConfigApplicationContext ইত্যাদি ব্যবহার করা হয়।
২. BeanFactory:
- এটি Spring Framework এর পুরানো সংস্করণ যা শুধুমাত্র Bean lifecycle এর জন্য ব্যবহৃত হয়।
- এটি সাধারণত কমপ্লেক্স এবং বড় অ্যাপ্লিকেশনের জন্য প্রয়োজন হয় না, তবে ছোট এবং সংক্ষিপ্ত অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করা যেতে পারে।
SpEL এবং DI
Spring Expression Language (SpEL) DI এবং Bean কনফিগারেশন প্রক্রিয়াতে ব্যবহৃত হতে পারে। আপনি Spring Bean এর মান স্পষ্টভাবে SpEL ব্যবহার করে কনফিগার করতে পারেন।
উদাহরণ: SpEL ব্যবহার করে Bean কনফিগারেশন
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ProductService {
@Value("#{T(java.lang.Math).PI}") // SpEL Example
private double pi;
public void showProductDetails() {
System.out.println("Product Details: SpEL PI Value: " + pi);
}
}
এখানে @Value("#{T(java.lang.Math).PI}") SpEL এক্সপ্রেশন ব্যবহার করে pi ফিল্ডে Math.PI-এর মান ইনজেক্ট করা হচ্ছে।
উপসংহার
Spring Dependency Injection (DI) একটি শক্তিশালী ডিজাইন প্যাটার্ন যা কোডের রক্ষণাবেক্ষণযোগ্যতা, নমনীয়তা এবং টেস্টেবিলিটি উন্নত করে। Spring Bean এবং Spring Container এর মাধ্যমে এই DI ব্যবস্থাপনাটি Spring Framework-এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলির মধ্যে একটি। আপনি যদি Spring Framework ব্যবহার করে অ্যাপ্লিকেশন তৈরি করেন, তাহলে DI এবং Bean কনফিগারেশন আপনার অ্যাপ্লিকেশনকে আরও পরিষ্কার এবং মডুলার করতে সাহায্য করবে। Spring DI আপনাকে অবজেক্টগুলির মধ্যে নির্ভরতাগুলি সহজে ইনজেক্ট করার সুবিধা দেয়, এবং SpEL এই প্রক্রিয়াতে আরও ডাইনামিক এবং কাস্টমাইজড অপশন সরবরাহ করে।
Read more