স্প্রিং ডিপেনডেন্সি ইনজেকশন (DI) হল একটি কোর কনসেপ্ট, যেখানে স্প্রিং কনটেইনার বিভিন্ন Bean এর ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করে। তবে, যদি একাধিক Bean একই ধরনের (যেমন একই টাইপ) ইনজেক্ট করা হয়, তখন স্প্রিং কনটেইনার বিভ্রান্ত হতে পারে যে কোন Bean ইনজেক্ট করা হবে। এ ক্ষেত্রে @Qualifier অ্যানোটেশন ব্যবহার করে নির্দিষ্ট Bean ইনজেক্ট করা হয়।
@Qualifier এর ভূমিকা
@Qualifier অ্যানোটেশন স্প্রিং DI-তে দুটি বা তার বেশি Bean এর মধ্যে নির্দিষ্ট একটি Bean নির্বাচন করতে ব্যবহৃত হয়। এটি সাধারণত @Autowired এর সাথে ব্যবহৃত হয়, যেখানে একাধিক Bean ইনজেক্ট করার প্রয়োজন হতে পারে। @Qualifier নিশ্চিত করে যে নির্দিষ্ট Bean টি সঠিকভাবে ইনজেক্ট হবে।
@Qualifier ব্যবহার করার প্রক্রিয়া
১. @Qualifier অ্যানোটেশন নির্দিষ্ট Bean কে ইনজেক্ট করার জন্য স্প্রিং কনটেইনারকে নির্দেশ দেয়। ২. @Qualifier এর মান হিসেবে Bean এর id বা name প্রদান করতে হয়, যেটি Bean এর @Component বা @Bean অ্যানোটেশনের মধ্যে ডিফাইন করা হয়।
উদাহরণ সহ @Qualifier ব্যবহার
ধরা যাক, আমাদের দুটি EmployeeService Bean রয়েছে এবং আমরা চাই যে নির্দিষ্ট Bean ইনজেক্ট করা হোক।
Step ১: Bean গুলি তৈরি
@Component
public class EmployeeServiceFullTime implements EmployeeService {
@Override
public String getEmployeeType() {
return "Full-Time Employee";
}
}
@Component
public class EmployeeServicePartTime implements EmployeeService {
@Override
public String getEmployeeType() {
return "Part-Time Employee";
}
}
এখানে, EmployeeServiceFullTime এবং EmployeeServicePartTime দুটি Bean রয়েছে যেগুলি একই ইন্টারফেস EmployeeService ইমপ্লিমেন্ট করেছে।
Step ২: @Qualifier ব্যবহার করে নির্দিষ্ট Bean ইনজেক্ট করা
@Component
public class EmployeeController {
private EmployeeService employeeService;
@Autowired
@Qualifier("employeeServiceFullTime") // Specify which Bean to inject
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
public String getEmployeeType() {
return employeeService.getEmployeeType();
}
}
এখানে, @Qualifier("employeeServiceFullTime") ব্যবহার করা হয়েছে, যার মাধ্যমে স্প্রিং কনটেইনার EmployeeServiceFullTime Bean টি ইনজেক্ট করবে।
Step ৩: স্প্রিং কনফিগারেশন
@Configuration
@ComponentScan("com.example")
public class AppConfig {
}
এখানে, @ComponentScan অ্যানোটেশন দ্বারা স্প্রিং কনটেইনারকে com.example প্যাকেজে থাকা সব Bean গুলি স্ক্যান করার জন্য নির্দেশ দেওয়া হয়েছে।
Step ৪: Main Application
public class MainApp {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
EmployeeController employeeController = context.getBean(EmployeeController.class);
System.out.println(employeeController.getEmployeeType()); // Output: Full-Time Employee
context.close();
}
}
এখানে, employeeController.getEmployeeType() কল করলে আউটপুট হিসেবে "Full-Time Employee" পাওয়া যাবে, কারণ @Qualifier("employeeServiceFullTime") এর মাধ্যমে সুনির্দিষ্ট Bean ইনজেক্ট করা হয়েছে।
@Qualifier এর আরও উদাহরণ
একাধিক Bean এর মধ্যে @Qualifier ব্যবহার
@Component("employeeServiceFullTime")
public class EmployeeServiceFullTime implements EmployeeService {
@Override
public String getEmployeeType() {
return "Full-Time Employee";
}
}
@Component("employeeServicePartTime")
public class EmployeeServicePartTime implements EmployeeService {
@Override
public String getEmployeeType() {
return "Part-Time Employee";
}
}
এখানে, @Qualifier ব্যবহার করার সময় Bean এর name বা id এর সাথে মিলিয়ে নাম প্রদান করতে হয়।
@Autowired
@Qualifier("employeeServicePartTime")
private EmployeeService employeeService;
এভাবে, স্প্রিং কনটেইনারে থাকা নির্দিষ্ট Bean নির্বাচন করতে @Qualifier ব্যবহার করা হয়।
@Qualifier এর সুবিধা
- বিশিষ্ট Bean নির্বাচন: একাধিক Bean থাকতে পারলেও
@Qualifierব্যবহারের মাধ্যমে নির্দিষ্ট Bean ইনজেক্ট করা যায়। - কোডের পরিষ্কারতা: কোড পরিষ্কার এবং সহজে মেইনটেনেবল হয়, কারণ SpEL বা অন্যান্য জটিল কৌশল ছাড়া নির্দিষ্ট Bean নির্বাচন করা যায়।
- নিরাপত্তা: ডিপেনডেন্সি ইনজেকশন প্রক্রিয়া সহজ এবং সঠিকভাবে কাজ করে, যা অ্যাপ্লিকেশন স্থিতিশীল রাখে।
উপসংহার
স্প্রিং এর @Qualifier অ্যানোটেশন ব্যবহারের মাধ্যমে একাধিক Bean এর মধ্যে নির্দিষ্ট Bean ইনজেক্ট করা যায়, যা ডিপেনডেন্সি ইনজেকশন প্রক্রিয়াটিকে আরও নমনীয় এবং কার্যকরী করে তোলে। বিশেষত যখন একই ধরনের (same type) Bean একাধিক থাকে, তখন এটি স্পষ্টভাবে কোন Bean ইনজেক্ট হবে তা নির্ধারণ করে। @Qualifier এবং @Autowired একসাথে ব্যবহার করে স্প্রিং ফ্রেমওয়ার্কে নির্দিষ্ট Bean নির্বাচন করা সহজ এবং পরিষ্কার হয়।