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