@Autowired অ্যানোটেশন হল স্প্রিং ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ডিপেনডেন্সি ইনজেকশন (DI) সহজ করে। এটি স্প্রিং কনটেইনারকে নির্দেশ দেয় যে, নির্দিষ্ট ক্লাসের ফিল্ড, কনস্ট্রাক্টর বা সেটার মেথডে ডিপেনডেন্সি ইনজেক্ট করতে হবে। @Autowired অ্যানোটেশন ব্যবহার করে স্প্রিং কনটেইনার অবজেক্টের ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ম্যানেজ করে, যাতে ক্লাসে নির্দিষ্ট অবজেক্টটি ইনস্ট্যান্সিয়েট করা এবং ইনজেক্ট করা সহজ হয়।
স্প্রিং কনটেইনার স্বয়ংক্রিয়ভাবে এক্সটেনশন প্যাটার্নের মাধ্যমে (কনস্ট্রাক্টর, সেটার অথবা ফিল্ডের মাধ্যমে) ইনজেকশন সম্পন্ন করে, তাই আপনি কোনো বিশেষ কোড লিখতে হয় না।
@Autowired অ্যানোটেশন কী?
@Autowired অ্যানোটেশনটি স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশনের জন্য ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে স্প্রিং কনটেইনারের মধ্যে থাকা অবজেক্টের ডিপেনডেন্সি ইনজেক্ট করতে ব্যবহৃত হয়, অর্থাৎ আপনাকে ডিপেনডেন্সি ম্যানুয়ালি ইনস্ট্যান্সিয়েট করতে হয় না।
@Autowired এর প্রধান বৈশিষ্ট্য:
- Automatic Dependency Injection: স্প্রিং কনটেইনার ক্লাসের ডিপেনডেন্সি খুঁজে বের করে এবং সেগুলো স্বয়ংক্রিয়ভাবে ইনজেক্ট করে।
- Supports Constructor, Setter, and Field Injection: এটি কনস্ট্রাক্টর ইনজেকশন, সেটার ইনজেকশন এবং ফিল্ড ইনজেকশন সমর্থন করে।
@Autowired অ্যানোটেশন ব্যবহারের স্থান
1. Field Injection (ফিল্ড ইনজেকশন)
এটা সবচেয়ে সহজ এবং সাধারণ ইনজেকশন পদ্ধতি। এখানে, স্প্রিং সরাসরি ফিল্ডে ডিপেনডেন্সি ইনজেক্ট করে।
উদাহরণ: Field Injection
@Component
public class EmployeeService {
@Autowired // Field Injection
private EmployeeRepository employeeRepository;
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
}
এখানে, @Autowired অ্যানোটেশন employeeRepository ফিল্ডে ইনজেক্ট করবে স্প্রিং কনটেইনার থেকে।
2. Constructor Injection (কনস্ট্রাক্টর ইনজেকশন)
কনস্ট্রাক্টর ইনজেকশনে, ডিপেনডেন্সি কনস্ট্রাক্টরের মাধ্যমে ইনজেক্ট করা হয়। এটি সবচেয়ে পছন্দনীয় পদ্ধতি, কারণ এতে ডিপেনডেন্সির ম্যানেজমেন্ট পরিষ্কার থাকে এবং ইমিউটেবল অবজেক্ট তৈরি করা যায়।
উদাহরণ: Constructor Injection
@Component
public class EmployeeService {
private final EmployeeRepository employeeRepository;
@Autowired // Constructor Injection
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
}
এখানে, কনস্ট্রাক্টরের মাধ্যমে employeeRepository ইনজেক্ট করা হচ্ছে। স্প্রিং কনটেইনার স্বয়ংক্রিয়ভাবে এই ডিপেনডেন্সি ইনজেক্ট করবে।
3. Setter Injection (সেটার ইনজেকশন)
Setter ইনজেকশনে, ডিপেনডেন্সি ইনজেক্ট করা হয় সেটার মেথডের মাধ্যমে। এটি ফিল্ড ইনজেকশন বা কনস্ট্রাকটর ইনজেকশনের তুলনায় কিছুটা কম ব্যবহৃত হয়।
উদাহরণ: Setter Injection
@Component
public class EmployeeService {
private EmployeeRepository employeeRepository;
@Autowired // Setter Injection
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
}
এখানে, setEmployeeRepository মেথডের মাধ্যমে employeeRepository ইনজেক্ট করা হচ্ছে।
@Autowired এর কাজের পদ্ধতি
স্প্রিং কনটেইনার যখন @Autowired অ্যানোটেশন দেখে, তখন এটি নির্দিষ্ট ডিপেনডেন্সি খুঁজে বের করে এবং সেটি ইনজেক্ট করে। ডিপেনডেন্সি ইনজেকশন করার সময় স্প্রিং দুটি পদ্ধতি অনুসরণ করে:
- Type-based Autowiring: স্প্রিং কনটেইনার তার টাইপের ভিত্তিতে ডিপেনডেন্সি খুঁজে বের করে। অর্থাৎ, আপনি যদি
EmployeeRepositoryটাইপের কোনো অবজেক্ট ইনজেক্ট করতে চান, তবে স্প্রিং কনটেইনারEmployeeRepositoryটাইপের ইনস্ট্যান্স খুঁজবে এবং ইনজেক্ট করবে। - Name-based Autowiring: আপনি চাইলে
@Qualifierঅ্যানোটেশন ব্যবহার করে নাম নির্দিষ্ট করতে পারেন, যাতে স্প্রিং একটি নির্দিষ্ট ইনস্ট্যান্স ইনজেক্ট করে।
@Autowired এর সুবিধা
- Automatic Dependency Injection: স্প্রিং কনটেইনার স্বয়ংক্রিয়ভাবে ডিপেনডেন্সি ইনজেক্ট করে, যার ফলে ম্যানুয়ালি ইনস্ট্যান্সিয়েট করার প্রয়োজন হয় না।
- Loose Coupling: DI ব্যবহারে ক্লাসগুলির মধ্যে কম সম্পর্ক থাকে, ফলে এক ক্লাসের পরিবর্তন অন্য ক্লাসে প্রভাব ফেলে না, এবং কোড সহজে রিফ্যাক্টর করা যায়।
- Testability: টেস্টিংয়ের জন্য মক অবজেক্ট ইনজেক্ট করা সহজ হয়, যেহেতু ডিপেনডেন্সিগুলো ইনজেক্ট করা হয় কনটেইনার থেকে।
- Flexibility: DI ব্যবহার করে কোডের মধ্যে বিভিন্ন পরিবর্তন করা সহজ হয়, কারণ ডিপেনডেন্সি ইনজেকশন পদ্ধতি পরিবর্তন করলেই শুধু কনফিগারেশন পরিবর্তন করতে হয়, কোডে কোনো পরিবর্তন করা লাগে না।
@Autowired এর সীমাবদ্ধতা
- Ambiguous Dependencies: যদি স্প্রিং কনটেইনারে একাধিক সমান টাইপের বিইন থাকে, তবে স্প্রিং সিদ্ধান্ত নিতে পারে না কোন বিইনটি ইনজেক্ট করতে হবে। এই সমস্যার সমাধান করতে
@Qualifierঅ্যানোটেশন ব্যবহার করা হয়। - Circular Dependency: একাধিক ক্লাস একে অপরকে ডিপেনডেন্ট হয়ে থাকলে (যেমন A → B → A), এটি একটি circular dependency তৈরি করতে পারে। এর সমাধান হিসেবে স্প্রিংে
@Lazyঅ্যানোটেশন ব্যবহার করা যায়।
সারাংশ
@Autowired অ্যানোটেশন স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশনের জন্য ব্যবহৃত হয়। এটি ফিল্ড, কনস্ট্রাক্টর, অথবা সেটার মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করতে সাহায্য করে এবং স্প্রিং কনটেইনার স্বয়ংক্রিয়ভাবে এই ইনজেকশন পরিচালনা করে। এর ফলে কোডে loose coupling তৈরি হয়, যা flexibility, testability, এবং maintainability বৃদ্ধি করে। @Autowired ব্যবহার করে কোডের কমপ্লেক্সিটি কমানো যায় এবং সিস্টেমের উন্নয়ন সহজ হয়।
Read more