Spring Dependency Injection (DI)-এ ব্যবহৃত দুটি গুরুত্বপূর্ণ অ্যানোটেশন হল @Autowired এবং @Resource। উভয় অ্যানোটেশনই Spring Beans-এর মধ্যে ডিপেনডেন্সি ইনজেকশন করতে ব্যবহৃত হয়, তবে তাদের ব্যবহার এবং কার্যক্রমে কিছু পার্থক্য রয়েছে।
নিচে @Autowired এবং @Resource এর মধ্যে প্রধান পার্থক্যগুলি তুলে ধরা হয়েছে:
1. @Autowired: Spring এর নিজস্ব অ্যানোটেশন
@Autowired হল Spring Framework-এর একটি অ্যানোটেশন, যা Spring Beans-এর মধ্যে ডিপেনডেন্সি ইনজেকশন করার জন্য ব্যবহৃত হয়। এটি Spring's Dependency Injection (DI) প্রক্রিয়ার অংশ এবং Spring এর নিজস্ব সমাধান।
@Autowired এর বৈশিষ্ট্য:
- Automatic Injection: Spring Beans-এর মধ্যে ডিপেনডেন্সি ইনজেকশনের জন্য এটি নিজে থেকে মেলানো (auto-wiring) করে।
- By Type: ডিফল্টভাবে,
@Autowiredটাইপের ভিত্তিতে Bean ইনজেক্ট করে। যদি একাধিক Bean একই টাইপের হয়, তবে এটি@Qualifierএর মাধ্যমে সঠিক Bean নির্বাচন করতে সাহায্য করে। - Required Attribute:
@Autowired-এrequiredনামক একটি অ্যাট্রিবিউট থাকে, যার মান true (ডিফল্ট) হলে যদি ডিপেনডেন্সি মেলে না, তবে Spring একটি NoSuchBeanDefinitionException ছুড়ে দেয়। যদি false সেট করা হয়, তবে তা অপশনাল হয়ে যাবে।
উদাহরণ:
@Component
public class Car {
@Autowired
private Engine engine; // Engine Bean will be injected by type
public void startCar() {
engine.start();
}
}
Required Attribute:
@Component
public class Car {
@Autowired(required = false)
private Engine engine; // Optional Dependency
public void startCar() {
if (engine != null) {
engine.start();
} else {
System.out.println("Engine is not available.");
}
}
}
2. @Resource: Java EE অ্যানোটেশন
@Resource একটি Java EE অ্যানোটেশন (javax.annotation package) এবং এটি J2EE-এর অংশ ছিল, তবে Spring এও এটি ব্যবহার করা যেতে পারে। এটি JNDI (Java Naming and Directory Interface) রেফারেন্সিংয়ের জন্য তৈরি করা হয়েছিল, তবে Spring-এ এটি Bean ডিপেনডেন্সি ইনজেকশনের জন্য ব্যবহৃত হয়।
@Resource এর বৈশিষ্ট্য:
- By Name:
@Resourceডিফল্টভাবে Bean নামের (name) ভিত্তিতে ইনজেক্ট করে। এটি Spring-এরnameঅ্যাট্রিবিউটের সাথে Bean ইনজেকশন করে। - Supports Both By Name and By Type: যদি
nameঅ্যাট্রিবিউট সঠিকভাবে দেওয়া না হয়, তবে by type ইনজেকশন করা হয়। - No
requiredAttribute:@Resourceঅ্যানোটেশনেrequiredঅ্যাট্রিবিউট থাকে না, তবে Bean না পাওয়া গেলেNullPointerExceptionহতে পারে।
উদাহরণ:
@Component
public class Car {
@Resource(name = "engine") // The "engine" bean will be injected by name
private Engine engine;
public void startCar() {
engine.start();
}
}
যদি @Resource ব্যবহার করা হয় এবং যদি name অ্যাট্রিবিউট না দেওয়া হয়, তবে Spring Bean টাইপের সাথে মেলে এমন Bean ইনজেক্ট করবে।
3. মূল পার্থক্য
| বৈশিষ্ট্য | @Autowired | @Resource |
|---|---|---|
| টাইপ/নাম অনুযায়ী ইনজেকশন | ডিফল্টভাবে টাইপ অনুযায়ী ইনজেকশন হয় | ডিফল্টভাবে নাম অনুযায়ী ইনজেকশন হয় |
| JNDI সমর্থন | না | হ্যাঁ, JNDI রেফারেন্সিং সমর্থন করে |
required অ্যাট্রিবিউট | required অ্যাট্রিবিউট রয়েছে (যা অপশনাল হতে পারে) | required অ্যাট্রিবিউট থাকে না |
| কোডে ব্যবহার | Spring specific (Spring DI) | Java EE-specific, Spring এও ব্যবহার করা যায় |
| Bean নামের ভিত্তিতে ইনজেকশন | না | হ্যাঁ (যদি name অ্যাট্রিবিউট ব্যবহার করা হয়) |
| ফিল্ড বা স্যাটার ইনজেকশন | ব্যবহারযোগ্য | ব্যবহারযোগ্য |
সারাংশ
@Autowiredএকটি Spring-specific অ্যানোটেশন যা by type ডিপেনডেন্সি ইনজেকশন করে, এবং এটি required অ্যাট্রিবিউট ব্যবহার করে Bean প্রয়োজনীয়তা নির্ধারণ করতে সাহায্য করে।@Resourceএকটি Java EE অ্যানোটেশন যা মূলত by name ডিপেনডেন্সি ইনজেকশন করে এবং Spring এ এর মাধ্যমে by type বা by name ডিপেনডেন্সি ইনজেকশন করা সম্ভব।
যেহেতু Spring DI-এ @Autowired অধিক ব্যবহৃত, তা Spring এর নিজস্ব সমাধান হিসেবে কাজ করে। তবে, @Resource Java EE-এর অংশ হওয়ায় এটি কিছু ক্ষেত্রে ব্যবহার হতে পারে যেখানে Java EE এর অন্যান্য কনফিগারেশন সহ Spring ব্যবহার করা হয়।