উদাহরণ সহ DI এর বেসিক ধারণা

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

334

ডিপেনডেন্সি ইনজেকশন (Dependency Injection - DI) কী?

ডিপেনডেন্সি ইনজেকশন (DI) একটি ডিজাইন প্যাটার্ন যা অবজেক্টগুলির মধ্যে ডিপেনডেন্সি সম্পর্ক (অথবা অন্য অবজেক্টগুলির প্রয়োজনীয়তা) পরিচালনা করার জন্য ব্যবহৃত হয়। এতে একটি অবজেক্ট তার ডিপেনডেন্সি বা প্রয়োজনীয় অবজেক্টগুলো সরাসরি তৈরি না করে, সেগুলো বাহ্যিকভাবে ইনজেক্ট করা হয়। স্প্রিং ফ্রেমওয়ার্কে ডিপেনডেন্সি ইনজেকশন একটি মূল ধারণা, যা কোডের নমনীয়তা, পুনরায় ব্যবহারযোগ্যতা, এবং টেস্টেবিলিটি উন্নত করতে সাহায্য করে।

স্প্রিং DI অবজেক্টগুলিকে একে অপরের উপর নির্ভরশীল করার পরিবর্তে, তাদের মধ্যে সম্পর্ক বা ডিপেনডেন্সি বাহ্যিকভাবে ইনজেক্ট করে, যার ফলে কোডের পরিবর্তন করা সহজ হয়ে ওঠে এবং অ্যাপ্লিকেশনের মডুলারিটি বৃদ্ধি পায়।


ডিপেনডেন্সি ইনজেকশনের ধরন

স্প্রিং DI প্রধানত তিনটি ধরনের ইনজেকশন সমর্থন করে:

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

1. Constructor Injection

Constructor Injection-এ একটি অবজেক্টের ডিপেনডেন্সি কনস্ট্রাকটরের মাধ্যমে ইনজেক্ট করা হয়। এটি DI এর একটি ক্লাসিক পদ্ধতি এবং নিরাপদ, কারণ কনস্ট্রাকটর ইনজেকশনে ডিপেনডেন্সি গুলি নির্ধারিত সময়েই ইনজেক্ট করা হয়, তাই এটি immutable হয়।

উদাহরণ:

public class UserService {
    private UserRepository userRepository;

    // Constructor Injection
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void addUser(User user) {
        userRepository.save(user);
    }
}

public class UserRepository {
    public void save(User user) {
        System.out.println("User saved!");
    }
}

এখানে UserService ক্লাসে UserRepository একটি ডিপেনডেন্সি, যা কনস্ট্রাকটরের মাধ্যমে ইনজেক্ট করা হয়েছে।

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-3.0.xsd">

    <bean id="userRepository" class="com.example.UserRepository"/>
    <bean id="userService" class="com.example.UserService">
        <constructor-arg ref="userRepository"/>
    </bean>

</beans>

এখানে, UserService Bean এর কনস্ট্রাকটরের মাধ্যমে UserRepository Bean ইনজেক্ট করা হয়েছে।


2. Setter Injection

Setter Injection-এ ডিপেনডেন্সি সেটার মেথডের মাধ্যমে ইনজেক্ট করা হয়। এটি কনস্ট্রাকটর ইনজেকশনের চেয়ে একটু নমনীয়, কারণ এখানে ডিপেনডেন্সি পরিবর্তনযোগ্য হয় এবং সরাসরি সেটার মেথডের মাধ্যমে ডিপেনডেন্সি ইনজেক্ট করা যায়।

উদাহরণ:

public class UserService {
    private UserRepository userRepository;

    // Setter Injection
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void addUser(User user) {
        userRepository.save(user);
    }
}

এখানে setUserRepository মেথডের মাধ্যমে UserRepository ইনজেক্ট করা হয়েছে।

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-3.0.xsd">

    <bean id="userRepository" class="com.example.UserRepository"/>
    <bean id="userService" class="com.example.UserService">
        <property name="userRepository" ref="userRepository"/>
    </bean>

</beans>

এখানে, UserService Bean এর userRepository প্রপার্টির মাধ্যমে UserRepository Bean ইনজেক্ট করা হয়েছে।


3. Field Injection

Field Injection-এ DI সরাসরি ক্লাসের ফিল্ডে (প্রপার্টি) ইনজেক্ট করা হয়, কোন গেটার বা সেটার মেথড ছাড়াই। যদিও এটি খুবই সহজ এবং কোড লেখা কমিয়ে দেয়, তবে সাধারণভাবে এটি খুবই দুর্বল এবং টেস্টিংয়ের জন্য উপযুক্ত নয়, কারণ এটি ডিপেনডেন্সির জন্য ক্লাসের ফিল্ডে সরাসরি ইনজেকশনের উপর নির্ভরশীল।

উদাহরণ:

public class UserService {
    @Autowired
    private UserRepository userRepository;

    public void addUser(User user) {
        userRepository.save(user);
    }
}

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-3.0.xsd">

    <bean id="userRepository" class="com.example.UserRepository"/>
    <bean id="userService" class="com.example.UserService"/>
    
</beans>

এখানে, @Autowired অ্যানোটেশন ব্যবহার করে UserRepository Bean UserService ক্লাসে সরাসরি ইনজেক্ট করা হয়েছে।


স্প্রিং ডিপেনডেন্সি ইনজেকশন এর সুবিধা

  1. কোডের নমনীয়তা বৃদ্ধি: DI ব্যবহার করে ক্লাসগুলির মধ্যে ডিপেনডেন্সি ইনজেক্ট করা হলে, ক্লাসগুলির মধ্যে যেকোনো পরিবর্তন সহজে করা সম্ভব হয় এবং কোডের নমনীয়তা বৃদ্ধি পায়।
  2. টেস্টিং সহজ হয়: DI ব্যবহার করে অবজেক্টগুলির মধ্যে ডিপেনডেন্সি বাইন্ড করা হয়, যার ফলে টেস্টিং সহজ হয়, কারণ ডিপেনডেন্সি মক বা স্টাব করা যেতে পারে।
  3. কোড রিইউজেবিলিটি: DI প্রভাবিত অ্যাপ্লিকেশন কোডে এক্সটেনশান এবং রিইউজেবিলিটি বাড়াতে সাহায্য করে, কারণ এটি ক্লাসগুলির মধ্যে সম্পর্ক ম্যানেজ করে।
  4. বৈশিষ্ট্য পরিবর্তন করা সহজ: ডিপেনডেন্সি ইনজেকশন ব্যবহৃত হলে, কোনো ক্লাসের বৈশিষ্ট্য বা ডিপেনডেন্সি সহজেই পরিবর্তন করা যায় এবং সিস্টেমের অবশিষ্ট অংশে প্রভাব না ফেলতে পারে।

সারাংশ

স্প্রিং ডিপেনডেন্সি ইনজেকশন (DI) একটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন যা অবজেক্টগুলির মধ্যে ডিপেনডেন্সি সম্পর্ক পরিচালনা করতে ব্যবহৃত হয়। স্প্রিং ফ্রেমওয়ার্কে DI এর মাধ্যমে কোডের নমনীয়তা, টেস্টেবিলিটি, এবং রিইউজেবিলিটি বৃদ্ধি পায়। DI ব্যবহারের জন্য তিনটি প্রধান পদ্ধতি হলো Constructor Injection, Setter Injection, এবং Field Injection। এর মধ্যে, Constructor Injection নিরাপদ এবং সুপারিশকৃত পদ্ধতি, তবে অন্যান্য পদ্ধতিও নির্দিষ্ট পরিস্থিতিতে ব্যবহৃত হতে পারে।


Content added By
Promotion

Are you sure to start over?

Loading...