Spring Framework-এ Dependency Injection (DI) ব্যবহারে @Resource একটি শক্তিশালী অ্যানোটেশন যা javax.annotation প্যাকেজের অন্তর্গত। এটি একটি স্ট্যান্ডার্ড অ্যানোটেশন যা Spring কনটেইনারে একটি Bean ইনজেক্ট করতে ব্যবহৃত হয়। @Resource ব্যবহার করে আপনি Spring IoC কনটেইনার থেকে নির্দিষ্ট Bean ইনজেক্ট করতে পারেন এবং এটি name বা type অনুযায়ী Bean নির্বাচন করতে সক্ষম।
@Resource অ্যানোটেশন মূলত JSR-250 স্পেসিফিকেশন থেকে এসেছে এবং Spring Framework এ ডিপেনডেন্সি ইনজেকশন করার জন্য একটি সাধারণ উপায় হিসেবে ব্যবহৃত হয়। এটি Spring-এর @Autowired অ্যানোটেশন থেকে কিছুটা আলাদা, কারণ এটি name বা type অনুসারে ডিপেনডেন্সি ইনজেকশন করে।
@Resource অ্যানোটেশন এর দুটি প্রধান বৈশিষ্ট্য:
- By Name: যদি Bean এর নাম ঠিকভাবে ম্যাচ করে, তবে
@Resourceসেটি ইনজেক্ট করবে। - By Type: যদি নাম ম্যাচ না করে, তবে
@ResourceBean-এর টাইপের উপর ভিত্তি করে ডিপেনডেন্সি ইনজেক্ট করবে।
@Resource এর ব্যবহার
১. By Name ইনজেকশন
Spring কনটেইনার থেকে নির্দিষ্ট নামের Bean ইনজেক্ট করতে @Resource(name = "beanName") ব্যবহার করা হয়।
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class EmployeeService {
@Resource(name = "employeeRepository")
private EmployeeRepository employeeRepository;
public void getEmployeeDetails() {
employeeRepository.findEmployee();
}
}
এখানে @Resource(name = "employeeRepository") ব্যবহার করা হয়েছে। এটি Spring কনটেইনারের মধ্যে employeeRepository নামের Bean কে ইনজেক্ট করবে। employeeRepository নামটি Bean এর নামের সাথে মেলাতে হবে।
২. By Type ইনজেকশন
যদি আপনি name উল্লেখ না করেন, তবে @Resource type অনুসারে Bean নির্বাচন করবে। নিচে @Resource এর মাধ্যমে By Type ইনজেকশনের উদাহরণ দেখানো হয়েছে:
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class EmployeeService {
@Resource
private EmployeeRepository employeeRepository;
public void getEmployeeDetails() {
employeeRepository.findEmployee();
}
}
এখানে, @Resource টাইপের উপর ভিত্তি করে EmployeeRepository Bean ইনজেক্ট করবে। এখানে Bean এর নাম উল্লেখ না করলেও Spring কনটেইনার EmployeeRepository টাইপের Bean নির্বাচন করবে।
৩. By Name and Type Involvement
@Resource নাম এবং টাইপ উভয়ের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করতে সাহায্য করে, তবে প্রথমে নাম অনুসারে এবং পরে টাইপ অনুসারে Bean নির্বাচিত হয়। এই উদাহরণে নাম এবং টাইপ উভয়ই ব্যবহার করা হয়েছে:
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class EmployeeService {
@Resource(name = "employeeRepository")
private EmployeeRepository employeeRepository;
@Resource
private DepartmentService departmentService;
public void getEmployeeDetails() {
employeeRepository.findEmployee();
departmentService.getDepartmentDetails();
}
}
এখানে, employeeRepository Bean নাম দ্বারা নির্বাচিত হবে, এবং departmentService Bean টাইপ দ্বারা নির্বাচিত হবে।
@Resource ব্যবহার করার জন্য প্রয়োজনীয় Bean কনফিগারেশন
১. Bean Configuration Using XML
XML কনফিগারেশনের মাধ্যমে @Resource অ্যানোটেশন দ্বারা Bean ইনজেকশন করার জন্য আপনাকে XML ফাইলে context:component-scan কনফিগার করতে হবে:
<context:component-scan base-package="com.example"/>
এটি Spring কনটেইনারকে কম্পোনেন্ট ক্লাসগুলো (যেমন @Component ব্যবহার করা ক্লাসগুলো) স্ক্যান করতে বলে এবং তাদেরকে Bean হিসাবে রেজিস্টার করে।
২. Bean Configuration Using Java Configuration
Java Config-এ @ComponentScan ব্যবহার করা যেতে পারে, যা Spring কনটেইনারকে কম্পোনেন্ট স্ক্যান করতে নির্দেশ দেয়।
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
এই কনফিগারেশনটি Spring কনটেইনারকে com.example প্যাকেজের মধ্যে থাকা সমস্ত কম্পোনেন্ট ক্লাসগুলো স্ক্যান করে এবং Bean হিসেবে নিবন্ধন করতে নির্দেশ দেয়।
@Resource vs @Autowired
@Resource এবং @Autowired দুটি প্রধান Dependency Injection অ্যানোটেশন, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে:
| বৈশিষ্ট্য | @Autowired | @Resource |
|---|---|---|
| Injection Type | Type-based Injection | Name-based (Primarily) or Type-based Injection |
| Default Behavior | By Type (can be overridden by @Qualifier) | By Name (can fall back to By Type) |
| Usage | Mostly used in Spring-specific contexts | JSR-250 standard for dependency injection |
উদাহরণ:
@Autowired: Sping Bean কনটেইনারের মধ্যে Bean-কে টাইপের ভিত্তিতে ইনজেক্ট করে।
@Autowired private EmployeeRepository employeeRepository;@Resource: Sping Bean কনটেইনারে Bean এর নাম বা টাইপের ভিত্তিতে ইনজেক্ট করে।
@Resource(name = "employeeRepository") private EmployeeRepository employeeRepository;
সারাংশ
@Resource অ্যানোটেশনটি Spring Framework-এ ডিপেনডেন্সি ইনজেকশন করার জন্য একটি জাভা স্ট্যান্ডার্ড অ্যানোটেশন। এটি name বা type এর ভিত্তিতে Bean ইনজেক্ট করতে ব্যবহৃত হয়। এটি Spring-এ ব্যবহৃত @Autowired এর থেকে আলাদা, কারণ @Autowired শুধু type-based ইনজেকশন সমর্থন করে, তবে @Resource এর মাধ্যমে আপনি নাম (name-based) এবং টাইপ (type-based) উভয়ই ভিত্তিতে ইনজেকশন করতে পারেন। @Resource JSR-250 স্পেসিফিকেশন থেকে এসেছে এবং Spring-এর বাইরেও অন্যান্য Java EE কনটেক্সটে ব্যবহারযোগ্য।