Spring DI এবং Collection Injection

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

341

Spring Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন যা Spring Framework এ ব্যবহৃত হয়, যেখানে Spring Container নির্ভরশীল অবজেক্টগুলো (Bean) তৈরি ও ইনজেক্ট করে। DI হল Spring Framework-এর একটি মূল বৈশিষ্ট্য যা কোডের নমনীয়তা এবং রক্ষণাবেক্ষণযোগ্যতা বাড়ায়। Spring DI এর মাধ্যমে আমরা অবজেক্টগুলির মধ্যে সম্পর্ক সহজে তৈরি করতে পারি এবং Spring Beans-এর লাইফসাইকেলকে নির্ভরশীলতা অনুযায়ী কাস্টমাইজ করতে পারি।

Collection Injection হল Spring DI-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যেখানে আমরা List, Set, বা Map টাইপের ডেটা কাঠামো (Collections) একটি Bean এ ইনজেক্ট করতে পারি। Spring Collection Injection ব্যবহার করে আপনি একাধিক Bean কে একসঙ্গে ইনজেক্ট করে তাদের মধ্যে সম্পর্ক তৈরি করতে পারেন। এটি সাধারণত List, Set, Map ইত্যাদি টাইপে ব্যবহৃত হয়।

এই টিউটোরিয়ালে, আমরা Spring DI এর মাধ্যমে কিভাবে Collections ইনজেক্ট করা যায় তা উদাহরণসহ দেখবো।


Spring DI এবং Collection Injection এর ধারণা

Collection Injection এর উদ্দেশ্য:

Spring DI এর মাধ্যমে আপনি একটি Bean এর মধ্যে Collection (যেমন List, Set, Map) ডেটা ইনজেক্ট করতে পারেন। Collection Injection ব্যবহার করে আপনি একাধিক Bean কে একটি Collection হিসেবে Spring Container-এ ইনজেক্ট করতে পারেন, এবং সেই Collection কে ব্যবহার করে বিভিন্ন কাজ করতে পারেন।

Spring DI-তে Collection Injection খুবই গুরুত্বপূর্ণ, কারণ এতে আপনাকে বিভিন্ন অবজেক্টকে একটি স্ট্রাকচারে সংরক্ষণ করার সুযোগ দেয়, যাতে কোড সহজ এবং নমনীয় থাকে।

Collection Injection এর প্রধান উপায়:

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

উদাহরণ ১: Spring DI এবং List Injection

Constructor-based Collection Injection (List)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class ShoppingCart {

    private List<String> items;

    @Autowired
    public ShoppingCart(List<String> items) {
        this.items = items;
    }

    public void showItems() {
        System.out.println("Shopping Cart contains: " + items);
    }
}

এখানে ShoppingCart Bean-এ একটি List ইনজেক্ট করা হয়েছে। @Autowired ব্যবহার করে Spring Container এই List ইনস্ট্যান্স কে ShoppingCart Bean-এর কনস্ট্রাকটরে ইনজেক্ট করবে।

Spring Configuration (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="shoppingCart" class="com.example.ShoppingCart">
        <constructor-arg>
            <list>
                <value>Apple</value>
                <value>Banana</value>
                <value>Orange</value>
            </list>
        </constructor-arg>
    </bean>
</beans>

এখানে XML কনফিগারেশন দ্বারা ShoppingCart Bean এর কনস্ট্রাকটরে একটি List ইনজেক্ট করা হচ্ছে, যা Apple, Banana, এবং Orange উপাদান নিয়ে গঠিত।

Main Class

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        ShoppingCart cart = context.getBean(ShoppingCart.class);
        cart.showItems();
    }
}

এখানে Spring Container থেকে ShoppingCart Bean রিট্রাইভ করা হচ্ছে এবং তার showItems() মেথড কল করা হচ্ছে, যা List থেকে Shopping Cart এর আইটেমগুলো প্রিন্ট করবে।


উদাহরণ ২: Spring DI এবং Set Injection

Setter-based Collection Injection (Set)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Set;

@Component
public class UserGroup {

    private Set<String> users;

    @Autowired
    public void setUsers(Set<String> users) {
        this.users = users;
    }

    public void showUsers() {
        System.out.println("User Group contains: " + users);
    }
}

এখানে UserGroup Bean-এ একটি Set ইনজেক্ট করা হয়েছে। @Autowired ব্যবহার করে Spring Container এই Set ইনস্ট্যান্সকে setUsers মেথডের মাধ্যমে ইনজেক্ট করবে।

Spring Configuration (XML)

<bean id="userGroup" class="com.example.UserGroup">
    <property name="users">
        <set>
            <value>John</value>
            <value>Jane</value>
            <value>Bob</value>
        </set>
    </property>
</bean>

এখানে XML কনফিগারেশনে UserGroup Bean-এর users প্রপার্টিতে একটি Set ইনজেক্ট করা হচ্ছে।

Main Class

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserGroup group = context.getBean(UserGroup.class);
        group.showUsers();
    }
}

এখানে Spring Container থেকে UserGroup Bean রিট্রাইভ করা হচ্ছে এবং showUsers() মেথড কল করা হচ্ছে, যা Set থেকে ইউজারের নামগুলো প্রিন্ট করবে।


উদাহরণ ৩: Spring DI এবং Map Injection

Field-based Collection Injection (Map)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;

@Component
public class ProductCatalog {

    @Autowired
    private Map<String, String> products;

    public void showProducts() {
        products.forEach((key, value) -> {
            System.out.println("Product: " + key + ", Price: " + value);
        });
    }
}

এখানে ProductCatalog Bean-এ একটি Map ইনজেক্ট করা হয়েছে। Spring Container @Autowired দিয়ে ডাইনামিকভাবে products Map ফিল্ডে মান ইনজেক্ট করবে।

Spring Configuration (XML)

<bean id="productCatalog" class="com.example.ProductCatalog">
    <property name="products">
        <map>
            <entry key="Apple" value="1.00"/>
            <entry key="Banana" value="0.50"/>
            <entry key="Orange" value="0.75"/>
        </map>
    </property>
</bean>

এখানে ProductCatalog Bean-এ products Map ইনজেক্ট করা হয়েছে, যেখানে বিভিন্ন পণ্যের নাম এবং তাদের দাম দেওয়া হয়েছে।

Main Class

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        ProductCatalog catalog = context.getBean(ProductCatalog.class);
        catalog.showProducts();
    }
}

এখানে Spring Container থেকে ProductCatalog Bean রিট্রাইভ করা হচ্ছে এবং showProducts() মেথড কল করা হচ্ছে, যা Map থেকে পণ্যের নাম এবং দাম প্রিন্ট করবে।


Collection Injection কেন গুরুত্বপূর্ণ?

  1. ডাইনামিক ডেটা ম্যানেজমেন্ট: Collection Injection আপনাকে একাধিক Bean ইনজেক্ট করে ডেটা ম্যানেজমেন্ট সহজ করে। উদাহরণস্বরূপ, আপনি একটি Set বা List ব্যবহার করে বিভিন্ন অবজেক্টের মধ্যে সম্পর্ক তৈরি করতে পারেন।
  2. কোডের নমনীয়তা: DI ব্যবহার করে Collection Injection আপনাকে কোডে পুনরাবৃত্তি কমাতে সাহায্য করে এবং কোডের নমনীয়তা ও মডুলারিটি বাড়ায়।
  3. একাধিক অবজেক্টে একসাথে ডিপেনডেন্সি ইনজেকশন: Collection Injection এর মাধ্যমে একসাথে একাধিক Bean ইনজেক্ট করা হয়। যেমন, List বা Set ব্যবহার করে আপনি একাধিক অবজেক্টকে একত্রে ম্যানেজ করতে পারেন।
  4. পারফরম্যান্স এবং মেমরি ব্যবস্থাপনা: Collection Injection প্রপারলি ব্যবহৃত হলে এটি Spring Beans-এর কার্যকরী ব্যবস্থাপনা নিশ্চিত করে, বিশেষত যখন একাধিক Bean একটি Collection এ গ্রুপ করা হয়।

উপসংহার

Spring Dependency Injection (DI) এর মাধ্যমে Collection Injection খুবই কার্যকরী একটি বৈশিষ্ট্য যা Spring Framework-এর মধ্যে অবজেক্ট ইনজেকশন এবং ম্যানিপুলেশন সহজ করে। List, Set, এবং Map এর মতো Collection ডেটা কাঠামোর মাধ্যমে একাধিক Bean ইনজেক্ট করা যায়, যা Spring Beans-এর মধ্যে সম্পর্ক সহজ করে তোলে এবং কোডের পুনরাবৃত্তি কমায়। Collection Injection এর মাধ্যমে Spring DI আরও নমনীয় এবং শক্তিশালী হয়ে ওঠে।

Content added By

স্প্রিং ডিপেনডেন্সি ইনজেকশন (Spring Dependency Injection বা DI) আপনাকে JavaBeans-এর মধ্যে ডিপেনডেন্সি ইনজেক্ট করার একটি শক্তিশালী প্রক্রিয়া প্রদান করে। যখন আপনার ডিপেনডেন্সি হিসেবে List, Set, বা Map ব্যবহার করতে হয়, তখন স্প্রিং কনটেইনার এই কালেকশনগুলির মধ্যে একাধিক অবজেক্ট ইনজেক্ট করার জন্য সহায়ক ব্যবস্থা প্রদান করে। স্প্রিং আপনাকে Collection Injection পরিচালনার জন্য বিভিন্ন উপায় প্রদান করে, যার মাধ্যমে একাধিক ভ্যালু বা অবজেক্ট ইনজেক্ট করা যায়।

এখানে আমরা List, Set, এবং Map-এর মাধ্যমে ডিপেনডেন্সি ইনজেকশন পরিচালনার উপায়গুলি আলোচনা করব।


List, Set, এবং Map এর মাধ্যমে DI পরিচালনা

স্প্রিং কনটেইনার List, Set, এবং Map ডিপেনডেন্সি ইনজেকশন পরিচালনা করার জন্য বিভিন্ন উপায় ব্যবহার করতে পারে। এগুলি সাধারণত অ্যানোটেশন বা XML কনফিগারেশন ফাইলে ব্যবহার করা হয়।


১. List এর মাধ্যমে DI পরিচালনা

List সাধারণত অর্ডারড (ordered) কালেকশন হিসেবে ব্যবহৃত হয়, যেখানে আপনি ইনজেক্ট করা অবজেক্টগুলির নির্দিষ্ট ক্রম বজায় রাখতে পারেন।

উদাহরণ:

ধরা যাক, আমাদের একটি Library ক্লাস আছে যা বইয়ের একটি List ইনজেক্ট করবে।

public class Book {
    private String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }
}

public class Library {
    private List<Book> books;

    // Constructor Injection
    public Library(List<Book> books) {
        this.books = books;
    }

    public void showBooks() {
        for (Book book : books) {
            System.out.println(book.getTitle());
        }
    }
}

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

<bean id="book1" class="com.example.Book">
    <constructor-arg value="Java Basics"/>
</bean>
<bean id="book2" class="com.example.Book">
    <constructor-arg value="Advanced Java"/>
</bean>

<bean id="library" class="com.example.Library">
    <constructor-arg>
        <list>
            <ref bean="book1"/>
            <ref bean="book2"/>
        </list>
    </constructor-arg>
</bean>

অ্যানোটেশন ভিত্তিক কনফিগারেশন:

@Component
public class Library {
    private List<Book> books;

    @Autowired
    public Library(List<Book> books) {
        this.books = books;
    }

    public void showBooks() {
        for (Book book : books) {
            System.out.println(book.getTitle());
        }
    }
}

এখানে, Library ক্লাসে List<Book> ইনজেক্ট করা হয়েছে এবং আমরা দুটি Book ইনস্ট্যান্স তৈরি করেছি। স্প্রিং কনটেইনার এই বইগুলিকে একটি List হিসাবে Library ক্লাসে ইনজেক্ট করবে।


২. Set এর মাধ্যমে DI পরিচালনা

Set সাধারণত অর্ডারড না-হওয়া কালেকশন হিসেবে ব্যবহৃত হয়, যেখানে যেকোনো অবজেক্ট ইনজেক্ট করা হলেও তাদের নির্দিষ্ট ক্রম বজায় রাখা হয় না।

উদাহরণ:

ধরা যাক, আমাদের একটি FruitBasket ক্লাস আছে যা Set হিসেবে কিছু ফল গ্রহণ করবে।

public class Fruit {
    private String name;

    public Fruit(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class FruitBasket {
    private Set<Fruit> fruits;

    // Constructor Injection
    public FruitBasket(Set<Fruit> fruits) {
        this.fruits = fruits;
    }

    public void showFruits() {
        for (Fruit fruit : fruits) {
            System.out.println(fruit.getName());
        }
    }
}

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

<bean id="fruit1" class="com.example.Fruit">
    <constructor-arg value="Apple"/>
</bean>
<bean id="fruit2" class="com.example.Fruit">
    <constructor-arg value="Banana"/>
</bean>

<bean id="fruitBasket" class="com.example.FruitBasket">
    <constructor-arg>
        <set>
            <ref bean="fruit1"/>
            <ref bean="fruit2"/>
        </set>
    </constructor-arg>
</bean>

অ্যানোটেশন ভিত্তিক কনফিগারেশন:

@Component
public class FruitBasket {
    private Set<Fruit> fruits;

    @Autowired
    public FruitBasket(Set<Fruit> fruits) {
        this.fruits = fruits;
    }

    public void showFruits() {
        for (Fruit fruit : fruits) {
            System.out.println(fruit.getName());
        }
    }
}

এখানে, FruitBasket ক্লাসে একটি Set ইনজেক্ট করা হয়েছে এবং ফলের সেট ইনজেক্ট করা হয়েছে, যার মধ্যে Apple এবং Banana রয়েছে। Set-এর মধ্যে অবজেক্টগুলির কোনও নির্দিষ্ট ক্রম থাকছে না।


৩. Map এর মাধ্যমে DI পরিচালনা

Map একটি কীগুচক (key-value pair) সংগ্রহ যেখানে প্রতিটি কী (key) মান (value)-এর সাথে যুক্ত থাকে। এটি ব্যবহার করা হয় যখন একাধিক কীগুচক যুক্ত ভ্যালু ইনজেক্ট করার প্রয়োজন হয়।

উদাহরণ:

ধরা যাক, আমাদের একটি EmployeeDetails ক্লাস আছে যা Map এর মাধ্যমে কর্মচারীদের নাম এবং তাদের পদের তথ্য গ্রহণ করবে।

public class Employee {
    private String name;
    private String position;

    public Employee(String name, String position) {
        this.name = name;
        this.position = position;
    }

    public String getName() {
        return name;
    }

    public String getPosition() {
        return position;
    }
}

public class EmployeeDetails {
    private Map<String, Employee> employeeMap;

    // Constructor Injection
    public EmployeeDetails(Map<String, Employee> employeeMap) {
        this.employeeMap = employeeMap;
    }

    public void showEmployeeDetails() {
        for (Map.Entry<String, Employee> entry : employeeMap.entrySet()) {
            System.out.println("ID: " + entry.getKey() + " | Name: " + entry.getValue().getName() + " | Position: " + entry.getValue().getPosition());
        }
    }
}

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

<bean id="employee1" class="com.example.Employee">
    <constructor-arg value="John"/>
    <constructor-arg value="Manager"/>
</bean>
<bean id="employee2" class="com.example.Employee">
    <constructor-arg value="Alice"/>
    <constructor-arg value="Developer"/>
</bean>

<bean id="employeeDetails" class="com.example.EmployeeDetails">
    <constructor-arg>
        <map>
            <entry key="1" value-ref="employee1"/>
            <entry key="2" value-ref="employee2"/>
        </map>
    </constructor-arg>
</bean>

অ্যানোটেশন ভিত্তিক কনফিগারেশন:

@Component
public class EmployeeDetails {
    private Map<String, Employee> employeeMap;

    @Autowired
    public EmployeeDetails(Map<String, Employee> employeeMap) {
        this.employeeMap = employeeMap;
    }

    public void showEmployeeDetails() {
        for (Map.Entry<String, Employee> entry : employeeMap.entrySet()) {
            System.out.println("ID: " + entry.getKey() + " | Name: " + entry.getValue().getName() + " | Position: " + entry.getValue().getPosition());
        }
    }
}

এখানে, EmployeeDetails ক্লাসে একটি Map<String, Employee> ইনজেক্ট করা হয়েছে, যেখানে কর্মচারীদের ID কীগুচক হিসেবে এবং তাদের অবস্থা (নাম, পদ) ভ্যালু হিসেবে ইনজেক্ট করা হয়েছে।


সারাংশ

স্প্রিং ডিপেনডেন্সি ইনজেকশনে List, Set, এবং Map ব্যবহার করা হলে, আপনি সহজেই একাধিক ডিপেনডেন্সি ইনজেক্ট করতে পারেন এবং স্প্রিং কনটেইনার এই কালেকশনগুলির মধ্যে অবজেক্টগুলি ইনজেক্ট করে। List ব্যবহার করলে আপনি অবজেক্টগুলির নির্দিষ্ট ক্রম বজায় রাখতে পারবেন, Set ব্যবহার করলে কোনো নির্দিষ্ট ক্রম থাকবে না, এবং Map ব্যবহার করলে আপনি কীগুচক (key-value pair) ভিত্তিক ডিপেনডেন্সি ইনজেক্ট করতে পারবেন।

Content added By

Spring Dependency Injection (DI) ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশনে বিভিন্ন ধরনের Beans এবং তাদের ডিপেনডেন্সি ইনজেক্ট করা হয়। তবে কখনও কখনও Collection Beans (যেমন: List, Set, Map) ইনজেক্ট করতে হয়, যেখানে একাধিক Bean একই টাইপের হয়ে থাকে। এই ধরনের পরিস্থিতিতে @Autowired এবং @Qualifier অ্যানোটেশনগুলি ব্যবহার করা হয়, যা নির্দিষ্ট Bean নির্বাচন এবং সঠিকভাবে ইনজেক্ট করার জন্য কার্যকরী।

@Autowired অ্যানোটেশন

@Autowired স্প্রিং ফ্রেমওয়ার্কে একটি গুরুত্বপূর্ণ অ্যানোটেশন, যা DI ব্যবহারের সময় স্প্রিং কনটেইনারে থাকা Bean গুলোকে স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে সহায়তা করে। এটি একটি বা একাধিক Bean-কে ইনজেক্ট করতে পারে, তবে যখন অনেক Beans এক ধরনের থাকে, তখন এটি সঠিক Bean নির্বাচন করতে পারে না। এই পরিস্থিতিতে @Qualifier ব্যবহার করা হয়।


@Qualifier অ্যানোটেশন

@Qualifier অ্যানোটেশনটি ব্যবহৃত হয় স্প্রিং কনটেইনারে একাধিক Bean থাকলে কোন Bean ইনজেক্ট করতে হবে তা নির্ধারণ করার জন্য। এটি @Autowired এর সাথে ব্যবহার করা হয় এবং নির্দিষ্ট Bean নির্বাচন করতে সহায়তা করে।


@Autowired এবং @Qualifier এর ব্যবহার

ধরা যাক, আপনার অ্যাপ্লিকেশনে দুটি ভিন্ন ধরনের Engine Bean রয়েছে, এবং আপনি একটি Car ক্লাসে সেগুলি ইনজেক্ট করতে চান। এই ক্ষেত্রে @Autowired এবং @Qualifier ব্যবহার করা হবে।

উদাহরণ: Collection Bean Injection

Step 1: Collection Beans তৈরি করা
import org.springframework.stereotype.Component;

@Component("dieselEngine")
public class DieselEngine implements Engine {
    @Override
    public void start() {
        System.out.println("Diesel Engine started");
    }
}

@Component("petrolEngine")
public class PetrolEngine implements Engine {
    @Override
    public void start() {
        System.out.println("Petrol Engine started");
    }
}

ব্যাখ্যা:
এখানে আমরা দুটি Bean তৈরি করেছি: DieselEngine এবং PetrolEngine, যেগুলো Engine ইন্টারফেস ইমপ্লিমেন্ট করে।

Step 2: Collection Bean Injection কনফিগার করা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class Car {

    private List<Engine> engines;

    @Autowired
    @Qualifier("dieselEngine")  // Specify the Bean to be injected
    public void setEngines(List<Engine> engines) {
        this.engines = engines;
    }

    public void startEngines() {
        for (Engine engine : engines) {
            engine.start();
        }
    }
}

ব্যাখ্যা:
এখানে @Autowired ব্যবহার করা হয়েছে Car ক্লাসের setEngines মেথডে, যাতে Engine Bean গুলো ইনজেক্ট করা যায়। তবে যেহেতু এখানে একাধিক Engine Bean থাকতে পারে, তাই @Qualifier ব্যবহার করা হয়েছে dieselEngine Bean ইনজেক্ট করতে।

Step 3: Spring Configuration
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.example")  // Package name where Beans are defined
public class AppConfig {

    @Bean
    public Engine petrolEngine() {
        return new PetrolEngine();
    }

    @Bean
    public Engine dieselEngine() {
        return new DieselEngine();
    }
}

ব্যাখ্যা:
এখানে @ComponentScan ব্যবহার করা হয়েছে স্প্রিং কনটেইনারকে নির্দেশ দেওয়ার জন্য কোন প্যাকেজ থেকে Bean গুলি স্ক্যান করতে হবে। এছাড়াও, petrolEngine() এবং dieselEngine() Bean গুলি কনফিগার করা হয়েছে।

Step 4: Main Application
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

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

        Car car = context.getBean(Car.class);
        car.startEngines();

        context.close();
    }
}

ব্যাখ্যা:
এখানে স্প্রিং কনটেইনার থেকে Car Bean রিট্রাইভ করা হয়েছে এবং startEngines() মেথড কল করা হয়েছে, যা নির্দিষ্ট Engine Bean ইনজেক্ট এবং চালু করবে।


@Autowired এবং @Qualifier এর সুবিধা

  1. Automatic Dependency Injection: @Autowired অ্যানোটেশন স্বয়ংক্রিয়ভাবে Bean ইনজেক্ট করতে সহায়তা করে, যা কোডে কমপ্লেক্সিটি কমায়।
  2. Flexible Dependency Injection: একাধিক Bean থাকলে @Qualifier এর মাধ্যমে নির্দিষ্ট Bean ইনজেক্ট করা যায়।
  3. Clearer Code: @Autowired এবং @Qualifier ব্যবহার করে কনফিগারেশন সহজ এবং স্পষ্ট হয়ে ওঠে।

উপসংহার

@Autowired এবং @Qualifier স্প্রিং ফ্রেমওয়ার্কে Collection Bean Injection এর জন্য অত্যন্ত কার্যকরী টুল। @Autowired এর মাধ্যমে আপনি অটোমেটিক ডিপেনডেন্সি ইনজেকশন করতে পারেন এবং @Qualifier ব্যবহার করে একাধিক Bean এর মধ্যে সঠিক Bean নির্বাচন করতে পারেন। এই দুটি অ্যানোটেশন ব্যবহার করার মাধ্যমে কোড আরও নমনীয়, সহজ এবং পুনঃব্যবহারযোগ্য হয়।

Content added By

Spring Framework-এ Collection Injection হল একটি অত্যন্ত কার্যকরী পদ্ধতি যার মাধ্যমে আপনি একটি Bean-এর মধ্যে একটি Collection (যেমন, List, Set, Map ইত্যাদি) ইনজেক্ট করতে পারেন। এটি Dependency Injection (DI) ব্যবহারের একটি বিশেষ ক্ষেত্র যেখানে একটি Bean একাধিক মান বা উপাদান ধারণ করে এবং সেই উপাদানগুলো অন্য Bean দ্বারা ইনজেক্ট করা হয়।

Spring-এ Collection Injection এর মাধ্যমে আপনি একটি Bean-এর মধ্যে একটি Collection (List, Set, বা Map) এর ডিপেনডেন্সি ইনজেক্ট করতে পারেন, যা সাধারণভাবে Spring Container থেকে সরবরাহ করা হয়।


Collection Injection: ব্যবহার

Spring Framework এ Collection Injection সাধারণত @Autowired অ্যানোটেশন ব্যবহার করে করা হয়। এটি ইনজেক্ট করা হয় List, Set, বা Map হিসেবে। এখানে আমরা কিছু সাধারণ উদাহরণ দেখবো।


1. List Injection (List দ্বারা Dependency Injection)

যখন আপনি একাধিক মান বা Bean ইনজেক্ট করতে চান, তখন List একটি আদর্শ কন্টেইনার হতে পারে।

উদাহরণ: List Injection

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

import java.util.List;

@Component
public class UserService {

    private List<String> users;

    @Autowired
    public void setUsers(List<String> users) {
        this.users = users;
    }

    public void showUsers() {
        for (String user : users) {
            System.out.println(user);
        }
    }
}

applicationContext.xml বা Java Config-এ List-এর উপাদানগুলি কনফিগার করতে হবে।

applicationContext.xml:

<bean id="userService" class="com.example.UserService">
    <property name="users">
        <list>
            <value>John</value>
            <value>Jane</value>
            <value>Bob</value>
        </list>
    </property>
</bean>

এখানে, UserService Bean-এ List ইনজেক্ট করা হয়েছে এবং এটি showUsers() মেথডের মাধ্যমে আউটপুট দেখাবে।


2. Set Injection (Set দ্বারা Dependency Injection)

Set ব্যবহার করা হয় যখন ডুপ্লিকেট মানের অনুমতি না দিয়ে বিভিন্ন ইউনিক উপাদান ইনজেক্ট করতে হয়।

উদাহরণ: Set Injection

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

import java.util.Set;

@Component
public class UserService {

    private Set<String> users;

    @Autowired
    public void setUsers(Set<String> users) {
        this.users = users;
    }

    public void showUsers() {
        for (String user : users) {
            System.out.println(user);
        }
    }
}

applicationContext.xml:

<bean id="userService" class="com.example.UserService">
    <property name="users">
        <set>
            <value>John</value>
            <value>Jane</value>
            <value>Bob</value>
        </set>
    </property>
</bean>

এখানে Set ব্যবহার করা হয়েছে যেখানে John, Jane, এবং Bob নামক ইউনিক ভ্যালুগুলি ইনজেক্ট করা হয়েছে।


3. Map Injection (Map দ্বারা Dependency Injection)

Map ব্যবহার করা হয় যখন ডিপেনডেন্সি ইনজেক্ট করার সময় key-value pair-এর মাধ্যমে উপাদানগুলো ইনজেক্ট করতে হয়।

উদাহরণ: Map Injection

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

import java.util.Map;

@Component
public class UserService {

    private Map<String, String> users;

    @Autowired
    public void setUsers(Map<String, String> users) {
        this.users = users;
    }

    public void showUsers() {
        for (Map.Entry<String, String> entry : users.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
    }
}

applicationContext.xml:

<bean id="userService" class="com.example.UserService">
    <property name="users">
        <map>
            <entry key="user1" value="John"/>
            <entry key="user2" value="Jane"/>
            <entry key="user3" value="Bob"/>
        </map>
    </property>
</bean>

এখানে Map ব্যবহার করা হয়েছে এবং প্রতিটি key-value pair এর মাধ্যমে মান ইনজেক্ট করা হয়েছে। showUsers() মেথডে Map এর key-value pair গুলি আউটপুট করা হয়।


4. @Autowired with Collection of Beans

Spring-এ আপনি একাধিক Bean-ও ইনজেক্ট করতে পারেন যেগুলি একই ইন্টারফেস বা সুপার ক্লাসের ইমপ্লিমেন্টেশন। Spring এই Bean গুলি অটোমেটিক্যালি একটি Collection হিসেবে ইনজেক্ট করে।

উদাহরণ: Collection of Beans Injection

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

import java.util.List;

@Component
public class UserService {

    private List<PaymentService> paymentServices;

    @Autowired
    public void setPaymentServices(List<PaymentService> paymentServices) {
        this.paymentServices = paymentServices;
    }

    public void processPayments() {
        for (PaymentService service : paymentServices) {
            service.processPayment();
        }
    }
}

PaymentService Bean ইন্টারফেসের ইমপ্লিমেন্টেশন হিসাবে CreditCardPaymentService এবং PaypalPaymentService এর মতো Beans থাকবে।

import org.springframework.stereotype.Component;

@Component
public class CreditCardPaymentService implements PaymentService {
    @Override
    public void processPayment() {
        System.out.println("Processing Credit Card Payment");
    }
}

@Component
public class PaypalPaymentService implements PaymentService {
    @Override
    public void processPayment() {
        System.out.println("Processing PayPal Payment");
    }
}

Spring Container দুইটি PaymentService Beans ইনজেক্ট করবে এবং UserService ক্লাসে paymentServices List-এ এই Beans গুলি ইনজেক্ট হবে।


Conclusion

Spring Framework-এ Collection Injection একটি শক্তিশালী পদ্ধতি যা আপনাকে List, Set, এবং Map এর মতো কন্টেইনারের মাধ্যমে একাধিক Bean বা ডিপেনডেন্সি ইনজেক্ট করতে সহায়তা করে। @Autowired অ্যানোটেশন এবং Spring Bean কনফিগারেশন (XML বা Java Config) ব্যবহার করে Collection Injection সহজে করা যায়। এটি Spring Beans-এর মধ্যে ডিপেনডেন্সি পরিচালনাকে আরও নমনীয় এবং পরিষ্কার করে তোলে।


Content added By
Promotion

Are you sure to start over?

Loading...