Spring @Autowired Annotation

স্প্রিং ডিপেনডেন্সি ইনজেকশন (ডিআই) (Spring Dependency Injection) - Java Technologies

314

@Autowired হল Spring Framework এর একটি অ্যানোটেশন যা Dependency Injection (DI) প্রক্রিয়া সহজতর করে। এই অ্যানোটেশন ব্যবহার করে, Spring কনটেইনার স্বয়ংক্রিয়ভাবে নির্ভরতাগুলিকে ইনজেক্ট করে, যাতে কোডে ম্যানুয়ালি অবজেক্ট তৈরি বা ইনস্ট্যান্সিয়েট করার প্রয়োজন না হয়। @Autowired মূলত constructor, field, এবং setter method-এর মাধ্যমে DI সম্পাদন করতে ব্যবহার করা হয়। এটি Spring Framework-এর মূল শক্তি এবং Inversion of Control (IoC) কনসেপ্টের অংশ।


@Autowired Annotation এর সুবিধা

১. সহজ DI বাস্তবায়ন

@Autowired অ্যানোটেশন ব্যবহারের মাধ্যমে Spring কনটেইনার স্বয়ংক্রিয়ভাবে নির্ভরতাগুলি ইনজেক্ট করে। ডেভেলপারদের জন্য ম্যানুয়াল ইনস্ট্যান্সিয়েশন বা কনস্ট্রাক্টর/সেটার মেথডে নির্ভরতাগুলি প্রেরণ করার প্রয়োজন হয় না। এটি কোডের ক্লিনলিনেস এবং রিডেবিলিটি বাড়িয়ে দেয়।

উদাহরণ:

@Component
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    public void processEmployee() {
        // employeeRepository স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হবে
        employeeRepository.save(new Employee());
    }
}

এখানে, employeeRepository ফিল্ডটি @Autowired দ্বারা ইনজেক্ট করা হয়েছে, Spring কনটেইনার স্বয়ংক্রিয়ভাবে এটি পূর্ণ করবে।


২. কনস্ট্রাকটর ইনজেকশন

Spring-এর constructor injection ব্যবহার করে, আপনি নিশ্চিত করতে পারেন যে নির্ভরতাগুলি অবজেক্টের নির্মাণের সময় ইনজেক্ট হবে। এটি immutable dependencies তৈরি করতে সহায়ক, এবং এটি স্পষ্টভাবে আপনার ক্লাসের নির্ভরতাগুলিকে দৃশ্যমান করে তোলে।

উদাহরণ:

@Component
public class EmployeeService {

    private final EmployeeRepository employeeRepository;

    @Autowired
    public EmployeeService(EmployeeRepository employeeRepository) {
        this.employeeRepository = employeeRepository;
    }
}

এখানে, EmployeeService এর কনস্ট্রাকটর ইনজেকশনের মাধ্যমে employeeRepository ইনজেক্ট করা হচ্ছে। এটি DI বাস্তবায়নের সবচেয়ে পরিষ্কার এবং সুপারিশকৃত পদ্ধতি।


৩. Setter Injection

Spring DI-এ setter method injection ব্যবহারের মাধ্যমে, আপনি setter মেথডে @Autowired অ্যানোটেশন ব্যবহার করে নির্ভরতাগুলি ইনজেক্ট করতে পারেন। এটি অনেক ক্ষেত্রেই ব্যবহার করা হয় যেখানে অবজেক্টের কনস্ট্রাকটর সেট করা কঠিন বা ঐচ্ছিক নির্ভরতাগুলি থাকতে পারে।

উদাহরণ:

@Component
public class EmployeeService {

    private EmployeeRepository employeeRepository;

    @Autowired
    public void setEmployeeRepository(EmployeeRepository employeeRepository) {
        this.employeeRepository = employeeRepository;
    }
}

এখানে, setEmployeeRepository() মেথডের মাধ্যমে employeeRepository ইনজেক্ট করা হয়েছে।


@Autowired এর কাজের পদ্ধতি

@Autowired অ্যানোটেশনটি constructor, field, এবং setter method-এ কাজ করে। Spring কনটেইনার যখন নির্ভরতাগুলি ইনজেক্ট করতে চায়, তখন এটি ঐ সব অবজেক্ট খুঁজে বের করে যা @Autowired দ্বারা চিহ্নিত। এটি দুটি প্রধান পদ্ধতিতে কাজ করতে পারে:

  1. Field Injection: Spring কনটেইনার সরাসরি ফিল্ডে নির্ভরতাগুলি ইনজেক্ট করে।
  2. Constructor Injection: Spring কনটেইনার কনস্ট্রাকটর মেথডের মাধ্যমে নির্ভরতাগুলি ইনজেক্ট করে।
  3. Setter Injection: Spring কনটেইনার setter মেথডের মাধ্যমে নির্ভরতাগুলি ইনজেক্ট করে।

@Autowired এর কাজ করার প্রক্রিয়া

Spring কনটেইনার একটি নির্দিষ্ট bean তৈরি করার সময়, এটি @Autowired অ্যানোটেশন সহ ফিল্ড, কনস্ট্রাকটর, অথবা setter মেথড খুঁজে বের করে এবং স্বয়ংক্রিয়ভাবে সম্পর্কিত নির্ভরতাগুলি ইনজেক্ট করে। এটি Spring-এর Inversion of Control (IoC) কনসেপ্ট অনুসরণ করে, যেখানে Spring কনটেইনার bean নির্মাণ এবং ইনজেকশন প্রক্রিয়া নিয়ন্ত্রণ করে।


@Autowired Annotation এর ব্যবহার

১. Field Injection

@Component
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository; // Field Injection
}

২. Constructor Injection

@Component
public class EmployeeService {

    private final EmployeeRepository employeeRepository;

    @Autowired
    public EmployeeService(EmployeeRepository employeeRepository) { // Constructor Injection
        this.employeeRepository = employeeRepository;
    }
}

৩. Setter Injection

@Component
public class EmployeeService {

    private EmployeeRepository employeeRepository;

    @Autowired
    public void setEmployeeRepository(EmployeeRepository employeeRepository) { // Setter Injection
        this.employeeRepository = employeeRepository;
    }
}

@Autowired এর সাথে Optional Dependencies

@Autowired অ্যানোটেশনটি optional dependencies ইনজেক্ট করার জন্যও ব্যবহার করা যেতে পারে, যেখানে নির্দিষ্ট নির্ভরতাগুলি উপস্থিত না থাকলেও Spring অ্যাপ্লিকেশনটি কোনো ত্রুটি ছাড়া কাজ করবে।

উদাহরণ:

@Component
public class EmployeeService {

    @Autowired(required = false)
    private Optional<EmployeeRepository> employeeRepository;

    public void processEmployee() {
        if (employeeRepository.isPresent()) {
            // যদি employeeRepository উপলব্ধ থাকে, তবে এটি ব্যবহার করুন
            employeeRepository.get().save(new Employee());
        }
    }
}

এখানে, @Autowired(required = false) ব্যবহার করা হয়েছে, যা Spring কনটেইনারকে নির্দিষ্ট নির্ভরতা না থাকলেও কোন ত্রুটি ছাড়া চলতে দেয়।


সারাংশ

@Autowired অ্যানোটেশন Spring Framework এর একটি অত্যন্ত শক্তিশালী এবং নমনীয় টুল, যা DI (Dependency Injection) বাস্তবায়নে সহায়ক। এটি Spring কনটেইনারের মাধ্যমে নির্ভরতাগুলি স্বয়ংক্রিয়ভাবে ইনজেক্ট করার জন্য ব্যবহৃত হয়। @Autowired এর মাধ্যমে আপনি field injection, constructor injection, এবং setter injection ব্যবহার করে নির্ভরতাগুলি অ্যাসাইন করতে পারেন। এই অ্যানোটেশন Spring অ্যাপ্লিকেশনের রক্ষণাবেক্ষণ, নমনীয়তা এবং টেস্টিংকে সহজতর করে, এবং এটি Spring Framework-এর অন্যতম মূল বৈশিষ্ট্য।

Content added By

@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 অ্যানোটেশন দেখে, তখন এটি নির্দিষ্ট ডিপেনডেন্সি খুঁজে বের করে এবং সেটি ইনজেক্ট করে। ডিপেনডেন্সি ইনজেকশন করার সময় স্প্রিং দুটি পদ্ধতি অনুসরণ করে:

  1. Type-based Autowiring: স্প্রিং কনটেইনার তার টাইপের ভিত্তিতে ডিপেনডেন্সি খুঁজে বের করে। অর্থাৎ, আপনি যদি EmployeeRepository টাইপের কোনো অবজেক্ট ইনজেক্ট করতে চান, তবে স্প্রিং কনটেইনার EmployeeRepository টাইপের ইনস্ট্যান্স খুঁজবে এবং ইনজেক্ট করবে।
  2. Name-based Autowiring: আপনি চাইলে @Qualifier অ্যানোটেশন ব্যবহার করে নাম নির্দিষ্ট করতে পারেন, যাতে স্প্রিং একটি নির্দিষ্ট ইনস্ট্যান্স ইনজেক্ট করে।

@Autowired এর সুবিধা

  1. Automatic Dependency Injection: স্প্রিং কনটেইনার স্বয়ংক্রিয়ভাবে ডিপেনডেন্সি ইনজেক্ট করে, যার ফলে ম্যানুয়ালি ইনস্ট্যান্সিয়েট করার প্রয়োজন হয় না।
  2. Loose Coupling: DI ব্যবহারে ক্লাসগুলির মধ্যে কম সম্পর্ক থাকে, ফলে এক ক্লাসের পরিবর্তন অন্য ক্লাসে প্রভাব ফেলে না, এবং কোড সহজে রিফ্যাক্টর করা যায়।
  3. Testability: টেস্টিংয়ের জন্য মক অবজেক্ট ইনজেক্ট করা সহজ হয়, যেহেতু ডিপেনডেন্সিগুলো ইনজেক্ট করা হয় কনটেইনার থেকে।
  4. Flexibility: DI ব্যবহার করে কোডের মধ্যে বিভিন্ন পরিবর্তন করা সহজ হয়, কারণ ডিপেনডেন্সি ইনজেকশন পদ্ধতি পরিবর্তন করলেই শুধু কনফিগারেশন পরিবর্তন করতে হয়, কোডে কোনো পরিবর্তন করা লাগে না।

@Autowired এর সীমাবদ্ধতা

  1. Ambiguous Dependencies: যদি স্প্রিং কনটেইনারে একাধিক সমান টাইপের বিইন থাকে, তবে স্প্রিং সিদ্ধান্ত নিতে পারে না কোন বিইনটি ইনজেক্ট করতে হবে। এই সমস্যার সমাধান করতে @Qualifier অ্যানোটেশন ব্যবহার করা হয়।
  2. Circular Dependency: একাধিক ক্লাস একে অপরকে ডিপেনডেন্ট হয়ে থাকলে (যেমন A → B → A), এটি একটি circular dependency তৈরি করতে পারে। এর সমাধান হিসেবে স্প্রিংে @Lazy অ্যানোটেশন ব্যবহার করা যায়।

সারাংশ

@Autowired অ্যানোটেশন স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশনের জন্য ব্যবহৃত হয়। এটি ফিল্ড, কনস্ট্রাক্টর, অথবা সেটার মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করতে সাহায্য করে এবং স্প্রিং কনটেইনার স্বয়ংক্রিয়ভাবে এই ইনজেকশন পরিচালনা করে। এর ফলে কোডে loose coupling তৈরি হয়, যা flexibility, testability, এবং maintainability বৃদ্ধি করে। @Autowired ব্যবহার করে কোডের কমপ্লেক্সিটি কমানো যায় এবং সিস্টেমের উন্নয়ন সহজ হয়।

Content added By

Spring Framework-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ প্যাটার্ন, যা Spring Beans-এর মধ্যে নির্ভরতা (dependencies) Inject করার জন্য ব্যবহৃত হয়। Spring DI ব্যবহার করার সময় @Autowired অ্যানোটেশনটি খুব গুরুত্বপূর্ণ ভূমিকা পালন করে, যা স্বয়ংক্রিয়ভাবে নির্ভরতা ইনজেক্ট করার জন্য ব্যবহৃত হয়।

@Autowired অ্যানোটেশনটি তিনটি প্রধান ধরনের ইনজেকশনে ব্যবহৃত হতে পারে:

  1. Field Injection
  2. Constructor Injection
  3. Setter Injection

এই তিনটি ইনজেকশন মেথডের মধ্যে @Autowired কিভাবে কাজ করে এবং প্রতিটি মেথডের সুবিধা ও অসুবিধা কী তা নিয়ে বিস্তারিত আলোচনা করা হবে।


১. Field Injection

Field Injection-এ @Autowired সরাসরি ফিল্ডে দেওয়া হয়, এবং Spring Container সেই ফিল্ডে নির্দিষ্ট Bean ইনজেক্ট করে। এটি সবচেয়ে সহজ এবং সরাসরি পদ্ধতি, তবে এটি কিছু সীমাবদ্ধতা এবং অসুবিধা থাকতে পারে, যেমন টেস্টিংয়ের সময় অবজেক্টের ইনস্ট্যান্সিং সমস্যা।

উদাহরণ:

@Component
public class Car {
    
    @Autowired
    private Engine engine;  // Field Injection
    
    public void start() {
        engine.start();
    }
}

এখানে, engine ফিল্ডটি @Autowired অ্যানোটেশন দ্বারা স্বয়ংক্রিয়ভাবে ইনজেক্ট হবে, এবং Spring Container Engine Bean খুঁজে পেয়ে এটি Car Bean-এ Inject করবে।

@Autowired এর ভূমিকা:

  • @Autowired অ্যানোটেশন Spring Container-কে বলে যে, engine ফিল্ডটি স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে হবে।
  • Spring Container সেই ফিল্ডের জন্য উপযুক্ত Bean খুঁজে বের করবে এবং সেটি Inject করবে।

সুবিধা:

  • কোডটি ছোট এবং পরিষ্কার।
  • কম কোড লিখতে হয়, এবং নির্ভরতা ইনজেকশন দ্রুত হয়।

অসুবিধা:

  • টেস্টিং সময় কনস্ট্রাক্টর বা সেটার মেথডের মাধ্যমে নির্ভরতা সরবরাহ করা কঠিন।
  • কোডের বাইন্ডিং শক্তি বেশি হয়, যার ফলে ম্যানিপুলেশন এবং মেইনটেন্যান্স কঠিন হতে পারে।

২. Constructor Injection

Constructor Injection-এ @Autowired কনস্ট্রাক্টরের মাধ্যমে নির্ভরতা ইনজেক্ট করা হয়। এটি DI ব্যবহারের অন্যতম শক্তিশালী পদ্ধতি, কারণ এটি ফিল্ডগুলোকে final বা অপরিবর্তনীয় রাখতে সহায়ক এবং এটি অবজেক্টের ইনস্ট্যান্সিং সময় নির্ভরতা ইনজেক্ট করে।

উদাহরণ:

@Component
public class Car {
    private final Engine engine;

    @Autowired
    public Car(Engine engine) {  // Constructor Injection
        this.engine = engine;
    }

    public void start() {
        engine.start();
    }
}

এখানে, @Autowired অ্যানোটেশন কনস্ট্রাক্টরের উপরে দেওয়া হয়েছে, যাতে Spring Container Engine Bean ইনজেক্ট করে Car Bean এর কনস্ট্রাক্টর-এ।

@Autowired এর ভূমিকা:

  • @Autowired অ্যানোটেশন Spring Container-কে বলে যে, কনস্ট্রাক্টরের মাধ্যমে নির্ভরতা ইনজেক্ট করতে হবে।
  • Spring Container উপযুক্ত Bean খুঁজে বের করে কনস্ট্রাক্টর-এ Inject করবে।

সুবিধা:

  • এটি কোডের অখণ্ডতা (immutability) বজায় রাখে, কারণ ফিল্ডগুলি final হতে পারে।
  • নির্ভরতা নিশ্চিতভাবে ইনজেক্ট করা হয়, যার ফলে null অবস্থা এড়ানো যায়।
  • একে টেস্টিং জন্যও খুবই উপকারী।

অসুবিধা:

  • কনস্ট্রাক্টর ইনজেকশনে সব dependencies কনস্ট্রাক্টর প্যারামিটার হিসাবে দিতে হয়, যা কিছু ক্ষেত্রে অতিরিক্ত জটিলতা সৃষ্টি করতে পারে।

৩. Setter Injection

Setter Injection-এ @Autowired অ্যানোটেশনটি সেটার মেথডের উপরে দেওয়া হয়, যাতে Spring Container সেই মেথডের মাধ্যমে নির্ভরতা ইনজেক্ট করে। এটি একটি ক্লাসের ফিল্ড বা প্রপার্টির জন্য নির্ভরতা ইনজেকশন করার একটি অত্যন্ত নমনীয় পদ্ধতি।

উদাহরণ:

@Component
public class Car {
    private Engine engine;

    @Autowired
    public void setEngine(Engine engine) {  // Setter Injection
        this.engine = engine;
    }

    public void start() {
        engine.start();
    }
}

এখানে, @Autowired অ্যানোটেশন setEngine() মেথডের উপর দেওয়া হয়েছে, যার মাধ্যমে Spring Container Engine Bean ইনজেক্ট করবে।

@Autowired এর ভূমিকা:

  • @Autowired অ্যানোটেশন Spring Container-কে বলে যে, setEngine() মেথডের মাধ্যমে নির্ভরতা ইনজেক্ট করতে হবে।
  • Spring Container নির্ভরতা খুঁজে বের করে এবং সেটি মেথডের মাধ্যমে Inject করবে।

সুবিধা:

  • এটি অত্যন্ত নমনীয়, কারণ আপনি নির্দিষ্ট মেথডের মাধ্যমে কেবল নির্ভরতা ইনজেক্ট করতে পারেন।
  • যদি কোনো অবজেক্টের ডিফল্ট মান সেট করতে চান, তবে setter method ব্যবহার করা যায়।

অসুবিধা:

  • টেস্টিংয়ের সময় setter মেথড দিয়ে নির্ভরতা ইনজেক্ট করা উচিত, তবে এটি কখনও কখনও অবাঞ্ছিত বা জটিল হতে পারে।
  • Setter Injection ব্যবহারে বাইন্ডিং দুর্বল হতে পারে, যার ফলে কোডের রক্ষণাবেক্ষণ কঠিন হতে পারে।

@Autowired এর মাধ্যমে DI এর কাজের প্রক্রিয়া

Spring DI এর কাজের প্রক্রিয়া এক্ষেত্রে হল:

  1. Field Injection: Spring Container @Autowired ফিল্ডের উপর প্রয়োগ করে নির্ভরতা ইনজেক্ট করে, এবং সেই অবজেক্টটি সরাসরি ইনজেক্ট করা হয়।
  2. Constructor Injection: @Autowired কনস্ট্রাক্টরের মাধ্যমে ইনজেকশন নিশ্চিত করে, যেখানে Spring Container কনস্ট্রাক্টর প্যারামিটার হিসেবে Bean ইনজেক্ট করে।
  3. Setter Injection: Spring Container @Autowired দ্বারা সেটার মেথডে ইনজেক্ট করে, যা পরে অবজেক্টের ফিল্ডে নির্ভরতা সরবরাহ করে।

সারাংশ

  • Field Injection: সহজ এবং সরাসরি পদ্ধতি, তবে টেস্টিং ও মেইনটেন্যান্সে কিছু সমস্যার সৃষ্টি হতে পারে।
  • Constructor Injection: সবচেয়ে শক্তিশালী এবং সুপারিশকৃত পদ্ধতি, যেখানে নির্ভরতা নিরাপদভাবে ইনজেক্ট করা হয় এবং কোডের ইমিউটেবিলিটি বজায় থাকে।
  • Setter Injection: নমনীয় পদ্ধতি, তবে কোডের বাইন্ডিং দুর্বল হতে পারে এবং কিছু ক্ষেত্রে অতিরিক্ত সেটিং প্রয়োজন হতে পারে।

Spring DI এর মধ্যে @Autowired ব্যবহার করে আপনি কোডের মডুলারিটি, টেস্টযোগ্যতা, এবং রক্ষণাবেক্ষণ সহজ করতে পারেন।

Content added By

Spring Dependency Injection (DI) একটি শক্তিশালী প্যাটার্ন যা স্প্রিং ফ্রেমওয়ার্কে অবজেক্ট ইনস্ট্যান্স এবং তাদের ডিপেনডেন্সি ম্যানেজমেন্ট স্বয়ংক্রিয়ভাবে পরিচালনা করে। যখন একাধিক @Bean এক্সটেনশন বা ক্লাস একই টাইপের ডিপেনডেন্সি প্রদান করে, তখন ডিপেনডেন্সি সিলেকশন কঠিন হয়ে যায়। এই সমস্যা সমাধান করতে @Qualifier অ্যানোটেশন ব্যবহার করা হয়।

এখানে আমরা দেখব কীভাবে Multiple Bean Injection এবং @Qualifier ব্যবহার করা যায় স্প্রিং প্রজেক্টে।


Multiple Bean Injection

স্প্রিং কনটেইনারে একাধিক @Bean একই টাইপের অবজেক্টের জন্য সেবা সরবরাহ করলে, স্প্রিংকে ডিপেনডেন্সি ইনজেকশনের সময় সিদ্ধান্ত নিতে বলা হয় যে কোন একটি অবজেক্ট ব্যবহার করতে হবে। যদি একাধিক @Bean একই টাইপের হয় এবং স্প্রিং কোডে @Autowired ব্যবহার করা হয়, তবে স্প্রিং একটি NoUniqueBeanDefinitionException ত্রুটি ছুঁড়ে দেয়, কারণ স্প্রিং কনটেইনার নিশ্চিত হতে পারে না যে কোন Bean ইনজেক্ট করতে হবে।

এই সমস্যা সমাধানে @Qualifier অ্যানোটেশন ব্যবহার করা হয়, যা স্পষ্টভাবে বলে দেয় কোন নির্দিষ্ট Bean নির্বাচন করতে হবে।


@Qualifier এর ব্যবহার

@Qualifier অ্যানোটেশন স্প্রিং কনটেইনারে ডিপেনডেন্সি ইনজেকশনের জন্য বিশেষ @Bean বা @Component নির্বাচন করতে সাহায্য করে। যখন একাধিক @Bean একই টাইপের হয়, তখন @Qualifier ব্যবহার করে নির্দিষ্ট Bean নির্বাচন করা সম্ভব হয়।


উদাহরণ: Multiple Bean Injection এবং @Qualifier

ধরা যাক, আমাদের একটি GreetingService ইন্টারফেস রয়েছে, এবং আমরা দুটি ভিন্ন ক্লাসের মধ্যে এই ইন্টারফেসের ইনস্ট্যান্স তৈরি করেছি। এখন আমরা @Qualifier ব্যবহার করে সঠিক Bean ইনজেক্ট করব।

Step 1: Service Interface তৈরি করা

public interface GreetingService {
    void greet();
}

Step 2: Service Implementation তৈরি করা

// First Implementation of GreetingService
@Component("greetingService1")
public class GreetingServiceImpl1 implements GreetingService {
    @Override
    public void greet() {
        System.out.println("Hello from GreetingServiceImpl1!");
    }
}

// Second Implementation of GreetingService
@Component("greetingService2")
public class GreetingServiceImpl2 implements GreetingService {
    @Override
    public void greet() {
        System.out.println("Hello from GreetingServiceImpl2!");
    }
}

এখানে, GreetingServiceImpl1 এবং GreetingServiceImpl2 উভয়ই GreetingService ইন্টারফেসের বাস্তবায়ন, এবং প্রতিটি Bean-কে আলাদা নাম দিয়ে @Component অ্যানোটেশন দেওয়া হয়েছে।

Step 3: Client Class তৈরি করা

এখন, Client ক্লাসে আমরা @Qualifier ব্যবহার করে সঠিক GreetingService Bean ইনজেক্ট করব।

@Component
public class Client {

    private GreetingService greetingService;

    // Constructor Injection with @Qualifier
    @Autowired
    public Client(@Qualifier("greetingService1") GreetingService greetingService) {
        this.greetingService = greetingService;
    }

    public void showGreeting() {
        greetingService.greet();
    }
}

এখানে, আমরা @Autowired এর সাথে @Qualifier ব্যবহার করে স্পষ্টভাবে greetingService1 Bean ইনজেক্ট করেছি।

Step 4: Spring Configuration (Java-based)

@Configuration
@ComponentScan("com.example")
public class AppConfig {

    @Bean
    public Client client() {
        return new Client(greetingService1());
    }

    @Bean
    public GreetingService greetingService1() {
        return new GreetingServiceImpl1();
    }

    @Bean
    public GreetingService greetingService2() {
        return new GreetingServiceImpl2();
    }
}

এখানে, AppConfig ক্লাসে আমরা দুইটি GreetingService Bean ডিফাইন করেছি এবং Client Bean-কে ইনস্ট্যান্স তৈরি করতে greetingService1 Bean ইনজেক্ট করেছি।


XML Configuration Example with @Qualifier

Spring XML কনফিগারেশন ফাইলেও @Qualifier অ্যানোটেশন ব্যবহার করা যায়। উদাহরণস্বরূপ:

<bean id="greetingService1" class="com.example.GreetingServiceImpl1"/>
<bean id="greetingService2" class="com.example.GreetingServiceImpl2"/>

<bean id="client" class="com.example.Client">
    <constructor-arg ref="greetingService1"/>
</bean>

এখানে, greetingService1 Beanটি Client ক্লাসে ইনজেক্ট করা হয়েছে, যেমনটি Java-based কনফিগারেশন ফাইলে করা হয়েছিল।


Step 5: Main Class

public class MainApp {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        Client client = context.getBean(Client.class);
        client.showGreeting();

        context.close();
    }
}

এখানে, Client Bean কনটেইনার থেকে রিট্রিভ করা হয়েছে এবং showGreeting() মেথড কল করা হয়েছে।


@Qualifier এর সুবিধা

  1. Multiple Bean Injection: একাধিক Bean একই টাইপের থাকলেও, @Qualifier ব্যবহার করে স্পষ্টভাবে কোন Bean ইনজেক্ট করতে হবে তা নির্ধারণ করা যায়।
  2. Clarity: কোডের মধ্যে Bean নির্বাচন পরিষ্কার এবং নির্দিষ্টভাবে প্রদর্শিত হয়।
  3. Custom Names: Bean নামের মাধ্যমে নির্দিষ্ট @Component বা @Bean নির্বাচন করা যায়, যা কোডের রিডেবিলিটি বৃদ্ধি করে।

সারাংশ

Multiple Bean Injection এবং @Qualifier স্প্রিং কনটেইনারে একাধিক Bean থাকলে সঠিক Bean নির্বাচন করতে সাহায্য করে। @Qualifier অ্যানোটেশন দিয়ে আপনি ডিপেনডেন্সি ইনজেকশনের সময় সঠিক Bean নির্বাচন করতে পারেন, যা একাধিক টাইপের Bean থাকলে ত্রুটি এড়াতে সাহায্য করে। এটি স্প্রিং DI-তে কোডের পরিষ্কারতা এবং ডাইনামিকতা আনতে সহায়ক।

Content added By

@Autowired কী?

@Autowired হলো একটি Spring Framework অ্যানোটেশন যা Dependency Injection (DI) এর জন্য ব্যবহৃত হয়। এটি Spring Container কে বলে দেয় যে, একটি Bean এর ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে হবে। Spring অ্যাপ্লিকেশনে, যেখানে কোনো Bean এর ডিপেনডেন্সি সরবরাহ করতে হয়, সেখানে @Autowired অ্যানোটেশন ব্যবহার করা হয়, এবং Spring এই ডিপেনডেন্সি ইনজেক্ট করে দেয়।

@Autowired এর ব্যবহার:

  • Field Injection
  • Setter Injection
  • Constructor Injection

1. Field Injection

Field Injection হল Spring DI এর সবচেয়ে সহজ পদ্ধতি, যেখানে সরাসরি ফিল্ডে @Autowired অ্যানোটেশন ব্যবহৃত হয়। Spring Container স্বয়ংক্রিয়ভাবে প্রয়োজনীয় Bean ইনজেক্ট করে।

উদাহরণ: Field Injection

ধরা যাক, আমাদের একটি Car ক্লাস রয়েছে, যেটি একটি Engine Bean এর ডিপেনডেন্সি নেয়। এখানে Field Injection ব্যবহার করা হয়েছে।

Engine ক্লাস:

package com.example.model;

public class Engine {
    public void ignite() {
        System.out.println("Engine started");
    }
}

Car ক্লাস:

package com.example.model;

import org.springframework.beans.factory.annotation.Autowired;

public class Car {
    
    @Autowired
    private Engine engine; // Injecting the Engine Bean

    public void start() {
        engine.ignite();
        System.out.println("Car is starting...");
    }
}

Spring XML কনফিগারেশন:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="engine" class="com.example.model.Engine"/>
    <bean id="car" class="com.example.model.Car"/>

</beans>

এখানে, @Autowired ব্যবহার করা হয়েছে Car ক্লাসের engine ফিল্ডে। Spring স্বয়ংক্রিয়ভাবে Engine Bean ইনজেক্ট করবে এবং Car Bean কে পূর্ণাঙ্গ করবে।


2. Setter Injection

Setter Injection পদ্ধতিতে, ডিপেনডেন্সি সেট করার জন্য Setter মেথড ব্যবহৃত হয়। Spring স্বয়ংক্রিয়ভাবে সেটার মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করে।

উদাহরণ: Setter Injection

ধরা যাক, আমরা আগের উদাহরণটিকে Setter Injection এর মাধ্যমে পরিবর্তন করি।

Car ক্লাস:

package com.example.model;

import org.springframework.beans.factory.annotation.Autowired;

public class Car {
    
    private Engine engine;

    @Autowired
    public void setEngine(Engine engine) {
        this.engine = engine; // Injecting the Engine Bean
    }

    public void start() {
        engine.ignite();
        System.out.println("Car is starting...");
    }
}

Spring XML কনফিগারেশন:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="engine" class="com.example.model.Engine"/>
    <bean id="car" class="com.example.model.Car"/>

</beans>

এখানে, @Autowired অ্যানোটেশনটি Setter মেথড setEngine() এর উপর ব্যবহার করা হয়েছে, যার মাধ্যমে Engine Bean স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হবে।


3. Constructor Injection

Constructor Injection হল ডিপেনডেন্সি ইনজেকশনের সবচেয়ে সুপারিশকৃত পদ্ধতি। এতে ডিপেনডেন্সি ইনজেক্ট করা হয় কনস্ট্রাক্টর মেথডের মাধ্যমে। এটি immutable objects তৈরি করার জন্য উপযুক্ত এবং টেস্টিং এর জন্য সহজ।

উদাহরণ: Constructor Injection

Car ক্লাস:

package com.example.model;

import org.springframework.beans.factory.annotation.Autowired;

public class Car {
    
    private Engine engine;

    @Autowired
    public Car(Engine engine) {
        this.engine = engine; // Injecting the Engine Bean via Constructor
    }

    public void start() {
        engine.ignite();
        System.out.println("Car is starting...");
    }
}

Spring XML কনফিগারেশন:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="engine" class="com.example.model.Engine"/>
    <bean id="car" class="com.example.model.Car"/>

</beans>

এখানে, Constructor Injection ব্যবহার করা হয়েছে Car ক্লাসে। @Autowired কনস্ট্রাক্টর মেথডে ব্যবহার করা হয়েছে এবং Spring স্বয়ংক্রিয়ভাবে Engine Bean ইনজেক্ট করবে।


4. @Autowired এবং Qualifier অ্যানোটেশন

যখন একই টাইপের একাধিক Bean থাকে, তখন SpEL এবং @Qualifier অ্যানোটেশন ব্যবহার করে নির্দিষ্ট Bean ইনজেক্ট করা সম্ভব।

উদাহরণ: @Autowired এবং @Qualifier ব্যবহার

Engine এবং ElectricEngine ক্লাস:

package com.example.model;

public class Engine {
    public void ignite() {
        System.out.println("Engine started");
    }
}

public class ElectricEngine extends Engine {
    public void ignite() {
        System.out.println("Electric Engine started");
    }
}

Car ক্লাস:

package com.example.model;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Car {
    
    private Engine engine;

    @Autowired
    @Qualifier("electricEngine") // Specify which Engine to inject
    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.ignite();
        System.out.println("Car is starting...");
    }
}

Spring XML কনফিগারেশন:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="engine" class="com.example.model.Engine"/>
    <bean id="electricEngine" class="com.example.model.ElectricEngine"/>
    <bean id="car" class="com.example.model.Car"/>

</beans>

এখানে, @Qualifier অ্যানোটেশন ব্যবহার করা হয়েছে যাতে Spring জানে কোন Engine Bean ইনজেক্ট করতে হবে যখন একাধিক Bean (যেমন Engine এবং ElectricEngine) একই টাইপের হবে।


সারাংশ

Spring Framework-এ @Autowired অ্যানোটেশন ব্যবহার করে আমরা ডিপেনডেন্সি ইনজেকশন (DI) করতে পারি। এটি ফিল্ড ইনজেকশন, সেটার ইনজেকশন এবং কনস্ট্রাক্টর ইনজেকশনের মাধ্যমে কাজ করতে পারে। @Autowired ব্যবহার করার মাধ্যমে, Spring Container স্বয়ংক্রিয়ভাবে ডিপেনডেন্সি ইনজেক্ট করে, যা কোডের সাপোর্টেবল এবং রিডেবিলিটি বাড়ায়। @Qualifier অ্যানোটেশন সহ ব্যবহার করলে একাধিক Bean ইনজেকশনের ক্ষেত্রে নির্দিষ্ট Bean নির্বাচন করা সম্ভব হয়।


Content added By
Promotion

Are you sure to start over?

Loading...