Spring Dependency Injection (DI) কী?
Spring Dependency Injection (DI) হলো একটি ডিজাইন প্যাটার্ন যা অবজেক্টগুলোর মধ্যে ডিপেনডেন্সি সম্পর্ক ম্যানেজ করতে সহায়ক। Spring DI এর মাধ্যমে, ক্লাসের মধ্যে অন্যান্য ক্লাসের অবজেক্টগুলো স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হয়, যাতে কোডের পুনঃব্যবহারযোগ্যতা এবং টেস্টেবিলিটি বৃদ্ধি পায়। FactoryBean স্প্রিং ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা আপনাকে কাস্টম লজিকের মাধ্যমে Bean তৈরি করতে সাহায্য করে।
Spring Framework এ FactoryBean ব্যবহার করে আপনি custom object creation লজিক এবং DI এর মাধ্যমে ইনজেকশন ম্যানেজ করতে পারেন।
FactoryBean কী?
Spring এর FactoryBean হলো একটি বিশেষ ধরনের Bean যা Bean Factory এর মতো কাজ করে এবং অন্য কোনো Bean তৈরি করার জন্য ব্যবহার করা হয়। এটি Spring IoC Container এ Bean তৈরি করার জন্য ব্যবহৃত হয়, কিন্তু সাধারণ @Bean বা <bean> কনফিগারেশন থেকে এটি আলাদা, কারণ এটি একটি Factory ক্লাসের মাধ্যমে Bean ইনস্ট্যানশিয়েট করে।
Spring এ FactoryBean ব্যবহার করলে আপনি Bean creation এর পুরো প্রক্রিয়া কাস্টমাইজ করতে পারেন। এটি custom object creation এবং complex initialization logic এর জন্য উপযোগী।
Custom FactoryBean তৈরি এবং DI এর সাথে Integration
1. Custom FactoryBean তৈরি করা
ধরা যাক, আমরা একটি Car Bean তৈরি করতে চাই যা একটি কাস্টম Engine Bean দ্বারা প্রাথমিকভাবে কনফিগার করা হবে। CarFactoryBean এর মাধ্যমে আমরা Car Bean তৈরি করব।
Engine ক্লাস:
package com.example.model;
public class Engine {
private String model;
public Engine(String model) {
this.model = model;
}
public String getModel() {
return model;
}
public void start() {
System.out.println("Engine " + model + " started.");
}
}
Car ক্লাস:
package com.example.model;
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.start();
System.out.println("Car started.");
}
}
CarFactoryBean ক্লাস:
এখন, আমরা একটি কাস্টম FactoryBean তৈরি করবো যা Car Bean তৈরি করবে এবং তার মধ্যে একটি Engine Bean ইনজেক্ট করবে।
package com.example.factory;
import org.springframework.beans.factory.FactoryBean;
import com.example.model.Car;
import com.example.model.Engine;
public class CarFactoryBean implements FactoryBean<Car> {
private String engineModel;
public void setEngineModel(String engineModel) {
this.engineModel = engineModel;
}
@Override
public Car getObject() throws Exception {
// Creating Car object with Engine injected
Engine engine = new Engine(engineModel);
return new Car(engine);
}
@Override
public Class<?> getObjectType() {
return Car.class;
}
@Override
public boolean isSingleton() {
return true; // This FactoryBean is a singleton
}
}
এখানে, CarFactoryBean ক্লাস Car Bean তৈরি করতে ব্যবহৃত হয় এবং তার মধ্যে একটি কাস্টম Engine Bean ইনজেক্ট করা হয়। setEngineModel মেথড ব্যবহার করে আমরা Engine এর মডেল প্যারামিটার সেট করতে পারব।
2. Spring Configuration এ FactoryBean Integration
Spring XML কনফিগারেশনে আমরা CarFactoryBean ব্যবহার করবো এবং এটি দিয়ে Car Bean তৈরি করবো।
Spring 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">
<!-- CarFactoryBean Bean Definition -->
<bean id="carFactoryBean" class="com.example.factory.CarFactoryBean">
<property name="engineModel" value="V8"/>
</bean>
<!-- Using CarFactoryBean to create a Car Bean -->
<bean id="car" factory-bean="carFactoryBean" factory-method="getObject"/>
</beans>
এখানে, আমরা carFactoryBean Bean কে CarFactoryBean ক্লাস থেকে ইনস্ট্যানশিয়েট করেছি এবং তারপর factory-bean এবং factory-method ব্যবহার করে Car Bean তৈরি করছি।
3. Java Configuration এ FactoryBean Integration
Spring Java Configuration এ FactoryBean ব্যবহার করতে হলে, আমরা Java কোডের মাধ্যমে FactoryBean কনফিগারেশন করতে পারি।
AppConfig ক্লাস:
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.factory.CarFactoryBean;
@Configuration
public class AppConfig {
@Bean
public CarFactoryBean carFactoryBean() {
CarFactoryBean factoryBean = new CarFactoryBean();
factoryBean.setEngineModel("V8");
return factoryBean;
}
@Bean
public Car car() throws Exception {
return carFactoryBean().getObject();
}
}
এখানে, CarFactoryBean এর মাধ্যমে Car Bean তৈরি করা হচ্ছে এবং car() মেথডের মাধ্যমে Bean এর অবজেক্টটি ফেরত দেওয়া হচ্ছে।
4. FactoryBean এর ব্যবহার DI এর সাথে Integration
Spring DI তে FactoryBean ব্যবহার করলে, এটি আপনাকে Bean তৈরি করার জন্য কাস্টম লজিক ইনজেক্ট করার সুযোগ দেয়। এখানে DI ব্যবহার করে Car Bean এর ডিপেনডেন্সি ম্যানেজমেন্ট করা হচ্ছে, যেখানে Engine Bean CarFactoryBean এর মাধ্যমে কাস্টম তৈরি হয়।
MainApp ক্লাস:
package com.example;
import com.example.config.AppConfig;
import com.example.model.Car;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApp {
public static void main(String[] args) throws Exception {
// Create Spring Container (ApplicationContext)
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Fetch Car Bean from Spring Container
Car car = context.getBean(Car.class);
car.start(); // Starting the car (with engine V8)
// Close the context
context.close();
}
}
এখানে, আমরা Spring ApplicationContext ব্যবহার করে Car Bean লোড করেছি এবং car.start() মেথড কল করেছি যা Engine Bean এর সাথে Car কে স্টার্ট করবে।
5. FactoryBean এর সুবিধা
- Custom Object Creation:
FactoryBeanব্যবহার করে আপনি কাস্টম অবজেক্ট তৈরি করতে পারেন যেখানে আরো জটিল initialization লজিক থাকতে পারে। - Complex Initialization: যখন একটি Bean তৈরি করার সময় অনেক কনফিগারেশন বা ডিপেনডেন্সি ম্যানিপুলেশন প্রয়োজন হয়, তখন
FactoryBeanব্যবহৃত হয়। - Integration with DI: Spring DI এর সাথে FactoryBean ব্যবহার করে আপনি আরো জটিল এবং কাস্টম Bean তৈরি করতে পারেন।
সারাংশ
Spring Framework-এ FactoryBean একটি শক্তিশালী বৈশিষ্ট্য যা custom Bean creation এবং complex initialization লজিক প্রদান করে। DI (Dependency Injection) এর মাধ্যমে আপনি FactoryBean ব্যবহার করে কাস্টম Beans তৈরি এবং তাদের ডিপেনডেন্সি ইনজেক্ট করতে পারেন। FactoryBean ব্যবহার করে কাস্টম অবজেক্ট তৈরি করা এবং Spring Container এ Bean গুলোর লাইফসাইকেল পরিচালনা করা যায়।