Spring Dependency Injection (DI) ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশনে বিভিন্ন ধরনের Beans এবং তাদের ডিপেনডেন্সি ইনজেক্ট করা হয়। তবে কখনও কখনও Collection Beans (যেমন: List, Set, Map) ইনজেক্ট করতে হয়, যেখানে একাধিক Bean একই টাইপের হয়ে থাকে। এই ধরনের পরিস্থিতিতে @Autowired এবং @Qualifier অ্যানোটেশনগুলি ব্যবহার করা হয়, যা নির্দিষ্ট Bean নির্বাচন এবং সঠিকভাবে ইনজেক্ট করার জন্য কার্যকরী।
@Autowired অ্যানোটেশন
@Autowired স্প্রিং ফ্রেমওয়ার্কে একটি গুরুত্বপূর্ণ অ্যানোটেশন, যা DI ব্যবহারের সময় স্প্রিং কনটেইনারে থাকা Bean গুলোকে স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে সহায়তা করে। এটি একটি বা একাধিক Bean-কে ইনজেক্ট করতে পারে, তবে যখন অনেক Beans এক ধরনের থাকে, তখন এটি সঠিক Bean নির্বাচন করতে পারে না। এই পরিস্থিতিতে @Qualifier ব্যবহার করা হয়।
@Qualifier অ্যানোটেশন
@Qualifier অ্যানোটেশনটি ব্যবহৃত হয় স্প্রিং কনটেইনারে একাধিক Bean থাকলে কোন Bean ইনজেক্ট করতে হবে তা নির্ধারণ করার জন্য। এটি @Autowired এর সাথে ব্যবহার করা হয় এবং নির্দিষ্ট Bean নির্বাচন করতে সহায়তা করে।
@Autowired এবং @Qualifier এর ব্যবহার
ধরা যাক, আপনার অ্যাপ্লিকেশনে দুটি ভিন্ন ধরনের Engine Bean রয়েছে, এবং আপনি একটি Car ক্লাসে সেগুলি ইনজেক্ট করতে চান। এই ক্ষেত্রে @Autowired এবং @Qualifier ব্যবহার করা হবে।
উদাহরণ: Collection Bean Injection
Step 1: Collection Beans তৈরি করা
import org.springframework.stereotype.Component;
@Component("dieselEngine")
public class DieselEngine implements Engine {
@Override
public void start() {
System.out.println("Diesel Engine started");
}
}
@Component("petrolEngine")
public class PetrolEngine implements Engine {
@Override
public void start() {
System.out.println("Petrol Engine started");
}
}
ব্যাখ্যা:
এখানে আমরা দুটি Bean তৈরি করেছি: DieselEngine এবং PetrolEngine, যেগুলো Engine ইন্টারফেস ইমপ্লিমেন্ট করে।
Step 2: Collection Bean Injection কনফিগার করা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class Car {
private List<Engine> engines;
@Autowired
@Qualifier("dieselEngine") // Specify the Bean to be injected
public void setEngines(List<Engine> engines) {
this.engines = engines;
}
public void startEngines() {
for (Engine engine : engines) {
engine.start();
}
}
}
ব্যাখ্যা:
এখানে @Autowired ব্যবহার করা হয়েছে Car ক্লাসের setEngines মেথডে, যাতে Engine Bean গুলো ইনজেক্ট করা যায়। তবে যেহেতু এখানে একাধিক Engine Bean থাকতে পারে, তাই @Qualifier ব্যবহার করা হয়েছে dieselEngine Bean ইনজেক্ট করতে।
Step 3: Spring Configuration
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.example") // Package name where Beans are defined
public class AppConfig {
@Bean
public Engine petrolEngine() {
return new PetrolEngine();
}
@Bean
public Engine dieselEngine() {
return new DieselEngine();
}
}
ব্যাখ্যা:
এখানে @ComponentScan ব্যবহার করা হয়েছে স্প্রিং কনটেইনারকে নির্দেশ দেওয়ার জন্য কোন প্যাকেজ থেকে Bean গুলি স্ক্যান করতে হবে। এছাড়াও, petrolEngine() এবং dieselEngine() Bean গুলি কনফিগার করা হয়েছে।
Step 4: Main Application
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.startEngines();
context.close();
}
}
ব্যাখ্যা:
এখানে স্প্রিং কনটেইনার থেকে Car Bean রিট্রাইভ করা হয়েছে এবং startEngines() মেথড কল করা হয়েছে, যা নির্দিষ্ট Engine Bean ইনজেক্ট এবং চালু করবে।
@Autowired এবং @Qualifier এর সুবিধা
- Automatic Dependency Injection:
@Autowiredঅ্যানোটেশন স্বয়ংক্রিয়ভাবে Bean ইনজেক্ট করতে সহায়তা করে, যা কোডে কমপ্লেক্সিটি কমায়। - Flexible Dependency Injection: একাধিক Bean থাকলে @Qualifier এর মাধ্যমে নির্দিষ্ট Bean ইনজেক্ট করা যায়।
- Clearer Code: @Autowired এবং @Qualifier ব্যবহার করে কনফিগারেশন সহজ এবং স্পষ্ট হয়ে ওঠে।
উপসংহার
@Autowired এবং @Qualifier স্প্রিং ফ্রেমওয়ার্কে Collection Bean Injection এর জন্য অত্যন্ত কার্যকরী টুল। @Autowired এর মাধ্যমে আপনি অটোমেটিক ডিপেনডেন্সি ইনজেকশন করতে পারেন এবং @Qualifier ব্যবহার করে একাধিক Bean এর মধ্যে সঠিক Bean নির্বাচন করতে পারেন। এই দুটি অ্যানোটেশন ব্যবহার করার মাধ্যমে কোড আরও নমনীয়, সহজ এবং পুনঃব্যবহারযোগ্য হয়।