Spring Dependency Injection (DI) Spring Framework এর একটি মূল বৈশিষ্ট্য, যা Beans-এর নির্ভরতাগুলি স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে সাহায্য করে। DI ব্যবহারের মাধ্যমে কোডের মডুলারিটি, টেস্টিং এবং রক্ষণাবেক্ষণ সহজ হয়। Spring DI এর মাধ্যমে Efficient Bean Management এবং Scope ব্যবহারের ধারণা গুরুত্বপূর্ণ, কারণ এই দুটি ফিচার Spring Beans-এর জীবনচক্র এবং ব্যবহারের উপযোগিতা নিয়ন্ত্রণ করে।
Efficient Bean Management
Spring Framework-এ Bean Management হল Spring Container এর দায়িত্ব, যা Bean তৈরি, পরিচালনা এবং ব্যবহারের জন্য অত্যন্ত কার্যকরী। Spring Beans সাধারণত একটি নির্দিষ্ট লাইফসাইকেল এবং স্টেট ম্যানেজমেন্ট প্রক্রিয়া অনুসরণ করে, যার মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বৃদ্ধি পায়।
Bean Management এর মূল লক্ষ্য:
- Bean Instantiation: Spring Container স্বয়ংক্রিয়ভাবে Beans তৈরি করে, যার ফলে Developer কে অবজেক্ট ইনস্ট্যান্সিয়েশন করার প্রয়োজন হয় না।
- Bean Lifecycle: Spring Container Beans-এর জীবনচক্র পরিচালনা করে (যেমন, initialization এবং destruction)।
- Bean Scopes: Spring Bean scopes ব্যবহার করে আপনি Bean-এর আচরণ নিয়ন্ত্রণ করতে পারেন (যেমন Singleton, Prototype, Request, Session, Application)।
Spring Bean Scope
Spring Beans বিভিন্ন Scope-এর অধীনে থাকতে পারে, যা Bean এর লাইফসাইকেল এবং ব্যবহারের উপযোগিতা নিয়ন্ত্রণ করে। Spring DI-তে সাধারণত ৫টি ধরনের Bean Scope রয়েছে:
১. Singleton Scope
Singleton Scope হল Spring Framework-এর ডিফল্ট স্কোপ, যার মাধ্যমে Spring Container কেবল একটি Bean ইনস্ট্যান্স তৈরি করে এবং সেই ইনস্ট্যান্সকে অ্যাপ্লিকেশন জুড়ে পুনঃব্যবহার করা হয়। অর্থাৎ, একটি Spring Bean শুধুমাত্র একবার তৈরি হয় এবং পুরো অ্যাপ্লিকেশনজুড়ে একই Bean ব্যবহার করা হয়।
উদাহরণ:
@Component
public class Car {
// Singleton Bean
private String model;
public Car() {
this.model = "Toyota";
}
public String getModel() {
return model;
}
}
Bean Configuration:
@Configuration
@ComponentScan("com.example")
public class AppConfig {
}
Usage:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car1 = context.getBean(Car.class);
Car car2 = context.getBean(Car.class);
System.out.println(car1 == car2); // Output: true (Singleton Bean)
এখানে Car Bean দুটি ভিন্ন অবজেক্ট হলেও, একটাই ইনস্ট্যান্স তৈরি হয়েছে এবং সেটাই পুনঃব্যবহৃত হচ্ছে, কারণ এটি Singleton Scope।
২. Prototype Scope
Prototype Scope এর মাধ্যমে Spring Container প্রতি রিকোয়েস্টের জন্য একটি নতুন Bean ইনস্ট্যান্স তৈরি করে। এই ক্ষেত্রে, প্রতিটি Bean রিকোয়েস্টে নতুন অবজেক্ট প্রদান করা হয়।
উদাহরণ:
@Component
@Scope("prototype")
public class Car {
private String model;
public Car() {
this.model = "Honda";
}
public String getModel() {
return model;
}
}
Usage:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car1 = context.getBean(Car.class);
Car car2 = context.getBean(Car.class);
System.out.println(car1 == car2); // Output: false (Prototype Bean)
এখানে, Car Bean দুটি ভিন্ন ইনস্ট্যান্স তৈরি হয়েছে, কারণ এটি Prototype Scope।
৩. Request Scope
Request Scope শুধুমাত্র ওয়েব অ্যাপ্লিকেশনে ব্যবহৃত হয়, যেখানে প্রতিটি HTTP রিকোয়েস্টের জন্য একটি নতুন Bean ইনস্ট্যান্স তৈরি করা হয়।
@Component
@Scope("request")
public class Car {
private String model;
public Car() {
this.model = "BMW";
}
public String getModel() {
return model;
}
}
এই Scope শুধুমাত্র ওয়েব অ্যাপ্লিকেশনে কার্যকরী এবং Spring MVC বা Spring WebFlux অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়।
৪. Session Scope
Session Scope শুধু HTTP সেশনের মধ্যে ব্যবহৃত হয়, যেখানে একটি Bean নির্দিষ্ট HTTP সেশনে সেগুলির জন্য জীবিত থাকে।
@Component
@Scope("session")
public class Car {
private String model;
public Car() {
this.model = "Audi";
}
public String getModel() {
return model;
}
}
এই Scope শুধুমাত্র ওয়েব অ্যাপ্লিকেশনগুলিতে কার্যকরী।
৫. Application Scope
Application Scope এর মাধ্যমে Bean সার্ভারের এক্সপ্লিটেশনে সারা অ্যাপ্লিকেশনের জন্য একটি একক ইনস্ট্যান্স তৈরি হয়। এটি ServletContext এর সাথে সম্পর্কিত।
@Component
@Scope("application")
public class Car {
private String model;
public Car() {
this.model = "Mercedes";
}
public String getModel() {
return model;
}
}
এই Scope ওয়েব অ্যাপ্লিকেশনগুলির জন্য কার্যকরী যেখানে একক Bean ইনস্ট্যান্স অ্যাপ্লিকেশন লেভেলে শেয়ার করা হয়।
Efficient Bean Management
Spring DI-এর মাধ্যমে Efficient Bean Management অর্জন করার জন্য, কিছু গুরুত্বপূর্ণ কার্যপদ্ধতি রয়েছে:
- Lazy Initialization: Beans গুলি শুধুমাত্র তখনই তৈরি হবে যখন সেগুলি প্রয়োজন হবে, এটি অ্যাপ্লিকেশন লোডের সময় কম ইনস্ট্যান্সিয়েশন ঘটায় এবং কার্যক্ষমতা উন্নত করে।
@Bean(initMethod = "init", destroyMethod = "destroy")
@Lazy
public Car car() {
return new Car();
}
- Autowiring: Beans ইনজেকশন সময় সহজ করা এবং নির্ভরতার স্বয়ংক্রিয় ম্যানেজমেন্ট নিশ্চিত করতে @Autowired অ্যানোটেশন ব্যবহার করা।
@Autowired
private Engine engine;
- Qualifiers: একাধিক Bean থাকলে সঠিক Bean নির্বাচন করতে @Qualifier অ্যানোটেশন ব্যবহার করা।
@Autowired
@Qualifier("electricEngine")
private Engine engine;
- Profile-specific Beans: একাধিক প্রোফাইলের জন্য ভিন্ন ভিন্ন Bean কনফিগারেশন নিশ্চিত করতে @Profile ব্যবহার করা।
@Profile("dev")
@Bean
public DataSource devDataSource() {
return new DataSource("dev-db-url");
}
- FactoryBeans: বিশেষ বা কাস্টম Bean তৈরি করার জন্য FactoryBean ব্যবহার করা যেতে পারে, যা Spring Container কে নির্দেশ দেয় কিভাবে Bean তৈরি করা হবে।
@Bean
public FactoryBean<Car> carFactoryBean() {
return new CarFactoryBean();
}
সারাংশ
Spring DI এবং Bean Scopes ব্যবহারের মাধ্যমে, Spring Framework একটি শক্তিশালী, ফ্লেক্সিবল এবং স্কেলযোগ্য Bean management সিস্টেম প্রদান করে। Singleton, Prototype, Request, Session, এবং Application Scope ব্যবহার করে Beans-এর জীবনচক্র এবং কার্যকারিতা নিয়ন্ত্রণ করা যায়। Spring DI এবং Bean Scopes এর মাধ্যমে আপনি কোডের পুনঃব্যবহারযোগ্যতা, কার্যক্ষমতা এবং টেস্টিং সহজ করতে পারেন। Efficient Bean Management এবং Scope ব্যবহার করে আপনার অ্যাপ্লিকেশনকে আরও শক্তিশালী এবং কাস্টমাইজেবল করা সম্ভব।