Spring এর মাধ্যমে Primary এবং Optional Bean Injection

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

316

Spring Framework-এ Dependency Injection (DI) একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা Spring Beans-কে একে অপরের মধ্যে নির্ভরতা ইনজেক্ট করতে সহায়ক হয়। কখনও কখনও, আপনার Spring অ্যাপ্লিকেশনে একাধিক Bean থাকতে পারে যেগুলির মধ্যে কোন একটি "প্রাথমিক" (primary) বা "অপশনাল" (optional) Bean হওয়া উচিত। Primary Bean এবং Optional Bean এর মাধ্যমে আপনি যেভাবে নির্দিষ্ট Bean নির্বাচন করবেন এবং ইনজেক্ট করবেন, তা Spring DI তে অত্যন্ত গুরুত্বপূর্ণ।

এই ধারণা দুটি (Primary এবং Optional Bean Injection) ব্যবহার করে, Spring-এর সাথে Bean নির্বাচন এবং ইনজেকশনকে আরও ফ্লেক্সিবল এবং কাস্টমাইজযোগ্য করা যায়।


১. Primary Bean Injection

Spring Framework-এ @Primary অ্যানোটেশন ব্যবহার করে, আপনি স্পষ্টভাবে Spring Container-এ একাধিক একই ধরনের Bean-এর মধ্যে যেটি প্রাথমিক (primary) Bean হিসেবে নির্বাচন করতে চান, তা চিহ্নিত করতে পারেন। যখন একাধিক Bean একই ধরনের থাকে, তখন @Primary অ্যানোটেশনটি ব্যবহৃত Bean কে প্রথম নির্বাচন করা হয়।

@Primary এর ভূমিকা:

  • @Primary অ্যানোটেশন দিয়ে Spring Container-এ প্রাথমিক Bean নির্বাচন করা হয়।
  • এটি যখন কোন নির্দিষ্ট Bean Inject করার জন্য একাধিক Bean পাওয়া যায়, তখন @Primary নির্বাচন করা Bean ইনজেক্ট হবে।

উদাহরণ:

@Component
public class Engine {
    public void start() {
        System.out.println("Engine is starting...");
    }
}

@Component
@Primary
public class DieselEngine extends Engine {
    @Override
    public void start() {
        System.out.println("Diesel Engine is starting...");
    }
}

@Component
public class ElectricEngine extends Engine {
    @Override
    public void start() {
        System.out.println("Electric Engine is starting...");
    }
}

@Component
public class Car {
    private Engine engine;

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

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

এখানে, DieselEngine Bean-এ @Primary অ্যানোটেশন দেওয়া হয়েছে। ফলে, Spring Container Car Bean-এ ইনজেক্ট করার সময় DieselEngine কে প্রাথমিক (primary) Bean হিসেবে ইনজেক্ট করবে, যদিও ElectricEngine Beanও বিদ্যমান।

উদাহরণ ব্যবহার:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.startCar();  // Output: Diesel Engine is starting...

@Primary এর সাহায্যে Spring নিশ্চিত করে যে DieselEngine Bean ইনজেক্ট করা হবে, যদি না কোনো নির্দিষ্ট নির্দেশনা (যেমন @Qualifier) দেওয়া হয়।


২. Optional Bean Injection

Optional Bean Injection হল এমন একটি কনফিগারেশন যেখানে কোনো নির্দিষ্ট Bean সিস্টেমে থাকতে বাধ্য নয়। Spring-এ @Autowired অ্যানোটেশন ব্যবহার করার সময়, যদি নির্দিষ্ট Bean পাওয়া না যায়, তবে তা স্বয়ংক্রিয়ভাবে null হতে পারে। তবে, কখনও কখনও, আপনি চাইতে পারেন যে Bean না পাওয়া গেলে এটি null না হয়ে অন্য একটি বিকল্প মান (default value) বা ফাংশনালিটি গ্রহণ করুক।

@Autowired এবং Optional Bean:

Spring-এ @Autowired ব্যবহার করে, আপনি Optional Bean Injection এর সুবিধা নিতে পারেন। যখন নির্দিষ্ট Bean অনুপস্থিত থাকে, তখন Spring এটি null হিসেবে রিটার্ন করে। আপনি Optional টাইপ ব্যবহার করতে পারেন যাতে যদি নির্দিষ্ট Bean পাওয়া না যায়, তবে সিস্টেমে কোনো ত্রুটি না ঘটে।

উদাহরণ:

@Component
public class Car {
    private Engine engine;

    @Autowired
    public Car(@Autowired(required = false) Engine engine) {
        this.engine = engine;
    }

    public void startCar() {
        if (engine != null) {
            engine.start();
        } else {
            System.out.println("No engine available");
        }
    }
}

এখানে, @Autowired(required = false) ব্যবহার করা হয়েছে, যার মাধ্যমে engine Beanটি অনুপস্থিত থাকলেও সিস্টেম কোনো সমস্যা ছাড়াই চালু থাকবে এবং "No engine available" প্রদর্শন করবে।

উদাহরণ ব্যবহার:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.startCar();  // Output: No engine available (if no engine bean is provided)

Optional Bean Injection এর মাধ্যমে আপনি এমন কিছু নির্ভরতা ইনজেক্ট করতে পারেন, যা আপনার অ্যাপ্লিকেশনের জন্য অপরিহার্য নয় এবং একাধিক কনফিগারেশনের জন্য সুবিধাজনক।


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

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

@Qualifier Example:

@Component
@Qualifier("diesel")
public class DieselEngine extends Engine {
    @Override
    public void start() {
        System.out.println("Diesel Engine is starting...");
    }
}

@Component
@Qualifier("electric")
public class ElectricEngine extends Engine {
    @Override
    public void start() {
        System.out.println("Electric Engine is starting...");
    }
}

@Component
public class Car {
    private Engine engine;

    @Autowired
    public Car(@Qualifier("electric") Engine engine) {
        this.engine = engine;
    }

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

এখানে, @Qualifier("electric") ব্যবহার করা হয়েছে, যা স্পষ্টভাবে বলে দেয় যে ElectricEngine Bean ইনজেক্ট করতে হবে।


সারাংশ

  • @Primary: যখন একাধিক Bean একই ধরনের থাকে এবং কোন একটি প্রাথমিক Bean হিসেবে নির্বাচিত করতে হয়, তখন @Primary অ্যানোটেশন ব্যবহার করা হয়। Spring Container প্রাথমিক Bean নির্বাচন করবে যদি অন্য কোন নির্দিষ্ট নির্দেশনা না থাকে।
  • Optional Bean Injection: @Autowired(required = false) ব্যবহার করে, Spring Bean ইনজেক্ট করতে চায় কিন্তু তা না পাওয়া গেলে তা null বা অন্য একটি বিকল্প মান গ্রহণ করতে পারে।
  • @Qualifier: যখন একাধিক Bean একই ধরনের থাকে এবং আপনাকে নির্দিষ্ট Bean ইনজেক্ট করতে হয়, তখন @Qualifier ব্যবহার করা হয় যাতে স্পষ্টভাবে সেই Bean নির্বাচন করা যায়।

Spring DI এর মাধ্যমে Primary এবং Optional Bean Injection ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশনটি আরও ফ্লেক্সিবল এবং কাস্টমাইজযোগ্য হয়, এবং বিভিন্ন ধরনের ডিপেনডেন্সি ইনজেকশন সহজে পরিচালিত হয়।

Content added By

স্প্রিং ডিপেনডেন্সি ইনজেকশন (DI) হল একটি ডিজাইন প্যাটার্ন যা ডিপেনডেন্সিগুলি ইনজেক্ট করে, এর মাধ্যমে স্প্রিং কনটেইনার অবজেক্ট এবং তাদের ডিপেনডেন্সিগুলির ম্যানেজমেন্ট স্বয়ংক্রিয়ভাবে করে। যখন একাধিক Bean একই টাইপের থাকে এবং স্প্রিংকে জানাতে হয় কোনটি ব্যবহার করতে হবে, তখন @Primary অ্যানোটেশন ব্যবহার করা হয়। এটি স্পষ্টভাবে বলে দেয় কোন Bean-কে ডিফল্ট (primary) হিসেবে নির্বাচন করতে হবে।

@Primary অ্যানোটেশন:

  • @Primary একটি স্প্রিং অ্যানোটেশন যা ডিফাইন করে কোন Bean টিকে ডিফল্ট (primary) Bean হিসেবে ব্যবহৃত হবে, যখন একাধিক Bean একই টাইপের থাকবে।
  • এটি সাধারণত তখন ব্যবহৃত হয় যখন একাধিক Bean একই টাইপের ডিপেনডেন্সি সরবরাহ করে, কিন্তু কোনো নির্দিষ্ট ডিফল্ট Bean প্রয়োজন হয়।

উদাহরণ: @Primary অ্যানোটেশন এর ব্যবহার

ধরা যাক আমাদের GreetingService নামক একটি ইন্টারফেস রয়েছে এবং তার দুইটি বাস্তবায়ন (Implementation) রয়েছে। স্প্রিং কনটেইনারে একাধিক Bean থাকলে কোনটিকে ইনজেক্ট করা হবে, সেটা নির্ধারণ করতে @Primary ব্যবহার করা যেতে পারে।

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

public interface GreetingService {
    void greet();
}

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

// 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!");
    }
}

এখানে, দুটি GreetingService ইমপ্লিমেন্টেশন @Component অ্যানোটেশন দিয়ে স্প্রিং কনটেইনারে ডিফাইন করা হয়েছে, তবে তাদের মধ্যে কোনটি @Primary ব্যবহার করবে তা নির্ধারণ করা হয়নি।

Step 3: @Primary অ্যানোটেশন ব্যবহার করা

এখন আমরা GreetingServiceImpl1 কে ডিফল্ট Bean হিসেবে চিহ্নিত করার জন্য @Primary অ্যানোটেশন ব্যবহার করব।

// Mark GreetingServiceImpl1 as Primary
@Component
@Primary
public class GreetingServiceImpl1 implements GreetingService {
    @Override
    public void greet() {
        System.out.println("Hello from GreetingServiceImpl1!");
    }
}

এখানে, GreetingServiceImpl1 Bean-এ @Primary অ্যানোটেশন দেওয়া হয়েছে, যা এটিকে ডিফল্ট (primary) Bean হিসেবে চিহ্নিত করবে।

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

এখন, Client ক্লাসে GreetingService ইনজেক্ট করা হবে। যেহেতু GreetingServiceImpl1 @Primary অ্যানোটেশন দিয়ে চিহ্নিত করা হয়েছে, এটি ইনজেক্ট হবে।

@Component
public class Client {

    private final GreetingService greetingService;

    @Autowired
    public Client(GreetingService greetingService) {
        this.greetingService = greetingService;
    }

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

Step 5: Spring Configuration (Java-based)

@Configuration
@ComponentScan("com.example")
public class AppConfig {
    // No need to define @Bean as @ComponentScan already handles it.
}

Step 6: 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(); // Output: Hello from GreetingServiceImpl1!

        context.close();
    }
}

Output:

Hello from GreetingServiceImpl1!

Explanation:

  • @Primary অ্যানোটেশন ব্যবহার করার কারণে, যখন GreetingService টাইপের ডিপেনডেন্সি ইনজেক্ট করা হয়েছে, তখন স্প্রিং স্বয়ংক্রিয়ভাবে GreetingServiceImpl1 Bean নির্বাচন করেছে, কারণ এটি @Primary দিয়ে চিহ্নিত।
  • যেহেতু greetingService2 রয়েছে, কিন্তু @Primary অ্যানোটেশন সেখানে নেই, এটি ডিফল্টভাবে ব্যবহৃত হয়নি।

@Primary এর সুবিধা

  1. Automatic Bean Selection: যখন একাধিক Bean থাকে এবং কোন একটি Bean-কে ডিফল্ট হিসেবে নির্বাচিত করতে হয়, তখন @Primary অ্যানোটেশনটি সহজে ব্যবহৃত হয়। এটি স্প্রিং কনটেইনারকে জানায় কোন Bean ইনজেক্ট করতে হবে।
  2. Clear and Concise: @Primary ব্যবহার করলে, কোডে স্পষ্টভাবে দেখানো যায় কোন Beanটি ডিফল্ট এবং এতে কোনো কনফিউশন তৈরি হয় না।
  3. Avoid @Qualifier Dependency: সাধারণত @Qualifier অ্যানোটেশন ব্যবহার করা হয় যখন একাধিক Bean থাকে, কিন্তু @Primary ব্যবহার করে ডিফল্ট Bean নির্বাচন করলে @Qualifier ব্যবহারের প্রয়োজন কমে যায়।
  4. Improves Readability: কোডের রিডেবিলিটি উন্নত হয়, কারণ কোডে স্পষ্টভাবে জানানো যায় কোন Bean সাধারণত ব্যবহৃত হবে।

সারাংশ

স্প্রিং-এ @Primary অ্যানোটেশন ব্যবহার করে একাধিক @Bean বা @Component এর মধ্যে কোনটি ডিফল্ট (primary) Bean হিসেবে ব্যবহৃত হবে, তা নির্ধারণ করা সম্ভব। এটি ডিপেনডেন্সি ইনজেকশনের সময় স্বয়ংক্রিয়ভাবে সঠিক Bean নির্বাচন করতে সাহায্য করে, এবং এর মাধ্যমে কোডের পরিষ্কারতা এবং রিডেবিলিটি বৃদ্ধি পায়। @Primary সাধারণত @Qualifier এর বিকল্প হিসেবে ব্যবহৃত হয় যখন একাধিক Bean একেই টাইপের থাকে।

Content added By

Spring Dependency Injection (DI) কী?

Spring Dependency Injection (DI) হল Spring Framework এর একটি মূল ধারণা যা ক্লাসগুলোর মধ্যে ডিপেনডেন্সি সম্পর্ক (dependencies) ম্যানেজ করতে সাহায্য করে। Spring DI এর মাধ্যমে Spring Container একটি Bean এর ডিপেনডেন্সি স্বয়ংক্রিয়ভাবে ইনজেক্ট করে। তবে কখনও কখনও কিছু Bean গুলি অবজেক্ট ইনজেক্ট করতে চায় না, অথবা নির্দিষ্ট Bean গুলি প্রয়োজনে থাকতে পারে এবং না থাকতে পারে (optional)। এই পরিস্থিতিতে Optional<> ব্যবহার করা হয়।

Optional<> ব্যবহার

Optional<> হল একটি Java 8 ফিচার যা একটি null-safe উপায়ে কোনো ভ্যালু ধারণ করতে ব্যবহৃত হয়। Spring DI তে, আপনি যখন একটি Bean ইনজেক্ট করতে চান যা optional (অথবা কখনও কখনও থাকতে পারে না), তখন Optional ব্যবহার করা যেতে পারে।

Spring এ Optional<> ব্যবহার করে, আপনি একটি Bean ইনজেক্ট করতে পারেন যা optional হতে পারে। যদি ঐ Bean উপস্থিত থাকে, তবে Spring DI সেই Bean ইনজেক্ট করবে, কিন্তু যদি Bean না থাকে, তবে Spring কোনো এক্সসেপশন ছাড়াই ডিফল্টভাবে Optional.empty() রিটার্ন করবে।


1. Optional<> ব্যবহার করে Bean Injection

যখন আপনি একটি Bean ইনজেক্ট করতে চান, কিন্তু সেই Bean কেবল নির্দিষ্ট পরিস্থিতিতে উপস্থিত থাকতে পারে (অথবা না থাকতে পারে), তখন Optional<> এর মাধ্যমে সেই Bean ইনজেক্ট করা যেতে পারে।

উদাহরণ:

ধরা যাক, আমাদের একটি Car Bean এবং একটি Engine Bean রয়েছে, যেখানে Engine Bean অতীব গুরুত্বপূর্ণ নয় এবং এটি optional হতে পারে।

Engine ক্লাস:

package com.example.model;

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

Car ক্লাস:

package com.example.model;

import java.util.Optional;

public class Car {
    
    private Optional<Engine> engine;  // Optional Engine injection

    public Car(Optional<Engine> engine) {
        this.engine = engine;
    }

    public void start() {
        if (engine.isPresent()) {
            engine.get().ignite();  // Use the engine if present
        } else {
            System.out.println("No engine present, but car is ready to roll!");
        }
    }
}

এখানে, Optional<Engine> ব্যবহার করা হয়েছে, যা Engine Bean এর উপস্থিতি যাচাই করে, এবং যদি Engine Bean না থাকে, তাহলে Spring Optional.empty() রিটার্ন করবে এবং start() মেথডে একটি আলাদা মেসেজ দেখাবে।

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">

    <!-- Engine Bean (Optional) -->
    <bean id="engine" class="com.example.model.Engine"/>
    
    <!-- Car Bean with Optional Engine -->
    <bean id="car" class="com.example.model.Car">
        <constructor-arg value="#{engine != null ? engine : null}"/>
    </bean>

</beans>

এখানে, engine Bean Car Bean-এ ইনজেক্ট করা হচ্ছে এবং আমরা নিশ্চিত হচ্ছি যে এটি optional। যদি engine Bean উপস্থিত না থাকে, Spring null প্রদান করবে এবং Optional.empty() ব্যবহৃত হবে।


2. Java Configuration এ Optional<> ব্যবহার

Spring Java Configuration ব্যবহার করলে Optional<> ব্যবহার করা যেতে পারে একইভাবে, যেখানে আমরা Optional Bean ইনজেক্ট করতে চাই।

AppConfig কনফিগারেশন ক্লাস:

package com.example.config;

import com.example.model.Car;
import com.example.model.Engine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Optional;

@Configuration
public class AppConfig {

    @Bean
    public Engine engine() {
        // Uncomment next line to make engine available
        // return new Engine();
        return null;  // Engine is optional, hence returning null for this example
    }

    @Bean
    public Car car() {
        return new Car(Optional.ofNullable(engine()));  // Injecting Optional Engine
    }
}

এখানে, Optional.ofNullable(engine()) ব্যবহৃত হয়েছে যা engine() Bean এর উপস্থিতি যাচাই করে। যদি engine() Bean উপস্থিত থাকে, তবে তা Optional এ ইনজেক্ট হবে; যদি না থাকে, তবে Optional.empty() রিটার্ন করবে।


3. Optional Bean Injection এর সুবিধা

  • Null Safety: Optional<> ব্যবহার করে আপনি null চেক করতে পারেন এবং কোনো NullPointerException থেকে রক্ষা পেতে পারেন।
  • Optional Dependency: কিছু Bean নির্দিষ্ট পরিস্থিতিতে প্রয়োজনীয় না হলে Optional<> ব্যবহার করা খুব কার্যকর। এটি optional dependencies বা conditional dependencies ইনজেক্ট করতে সহায়ক।
  • Cleaner Code: Optional<> ব্যবহারের মাধ্যমে, আপনি পরিষ্কারভাবে Bean এর উপস্থিতি বা অনুপস্থিতি চিহ্নিত করতে পারেন, যা কোডের পাঠযোগ্যতা বাড়ায়।

সারাংশ

Spring Framework-এ Optional<> ব্যবহার করে Optional Bean Injection খুবই কার্যকরী। এটি আপনাকে একটি Bean ইনজেক্ট করার সময় সহজেই null বা অনুপস্থিত Bean হ্যান্ডল করতে সাহায্য করে, যা কোডের নিরাপত্তা ও পরিচালনক্ষমতা বাড়ায়। Optional<> হল একটি Java 8 বৈশিষ্ট্য যা Spring DI এর মাধ্যমে null-safe ডিপেনডেন্সি ইনজেকশন প্রদান করতে ব্যবহৃত হয়, এবং Spring Container এর সাহায্যে আপনি optional dependencies এর সাথে কাজ করতে পারেন।


Content added By

Primary Bean Injection

Primary Bean Injection স্প্রিং ফ্রেমওয়ার্কে একটি বিশেষ বৈশিষ্ট্য, যা ব্যবহারকারীকে একাধিক Bean এর মধ্যে ডিফল্ট Bean নির্বাচন করতে সহায়তা করে। যখন স্প্রিং কন্টেইনারে একই টাইপের একাধিক Bean থাকে, তখন কোন Bean ইনজেক্ট হবে তা স্পষ্টভাবে নির্ধারণ করতে @Primary অ্যানোটেশন ব্যবহার করা হয়।

কেন @Primary ব্যবহার করবেন?

  • একাধিক Bean এর মধ্যে ডিফল্ট Bean নির্বাচন করার জন্য।
  • যখন আপনার অ্যাপ্লিকেশনে একাধিক Bean একটি নির্দিষ্ট টাইপের, কিন্তু আপনি একটি Bean কে ডিফল্ট হিসাবে নির্বাচন করতে চান।

@Primary এর ব্যবহার

ধরা যাক, আমরা দুটি Vehicle Bean (একটি Car এবং একটি Bike) তৈরি করেছি। এখানে, আমরা Car কে ডিফল্ট Bean হিসাবে নির্বাচন করব। এর জন্য @Primary অ্যানোটেশন ব্যবহার করা হবে।

Step 1: Vehicle Interface এবং তার Implementations তৈরি করা

public interface Vehicle {
    void drive();
}

@Component
@Primary
public class Car implements Vehicle {
    @Override
    public void drive() {
        System.out.println("Driving a car");
    }
}

@Component
public class Bike implements Vehicle {
    @Override
    public void drive() {
        System.out.println("Riding a bike");
    }
}

Step 2: Driver ক্লাস তৈরি করা

@Component
public class Driver {

    private Vehicle vehicle;

    // @Autowired injects the @Primary Vehicle (Car in this case)
    @Autowired
    public void setVehicle(Vehicle vehicle) {
        this.vehicle = vehicle;
    }

    public void startJourney() {
        vehicle.drive();
    }
}

Step 3: Spring Context থেকে Bean ব্যবহার করা

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Driver driver = context.getBean(Driver.class);
        driver.startJourney(); // Output: Driving a car
    }
}

এখানে, Car Bean @Primary অ্যানোটেশন ব্যবহার করে ডিফল্ট হিসাবে নির্বাচন করা হয়েছে। স্প্রিং কন্টেইনার Vehicle টাইপের জন্য Car Bean ইনজেক্ট করবে, কারণ এটি @Primary দ্বারা চিহ্নিত।


Optional Bean Injection

Optional Bean Injection তখন ব্যবহৃত হয়, যখন আপনার একটি Bean ইনজেক্ট করার প্রয়োজন হতে পারে, কিন্তু সেটা ঐচ্ছিক। যদি Bean উপলব্ধ না থাকে, তাহলে কোন সমস্যা হবে না। এটি মূলত @Autowired অ্যানোটেশনসহ @Optional অ্যানোটেশন বা Optional<T> টাইপ ব্যবহার করে বাস্তবায়ন করা হয়।

@Optional এর ব্যবহার

ধরা যাক, আমাদের একটি Driver ক্লাস রয়েছে, যেখানে GPS ইনজেক্ট করা হবে, কিন্তু এটি ঐচ্ছিক। যদি GPS Bean না থাকে, তাহলে স্প্রিং কন্টেইনারের কোনও সমস্যা হবে না এবং ড্রাইভার যাত্রা চালিয়ে যাবে।

Step 1: GPS ক্লাস তৈরি করা

public class GPS {
    public void navigate() {
        System.out.println("Navigating using GPS");
    }
}

Step 2: Driver ক্লাস তৈরি করা

@Component
public class Driver {

    private Vehicle vehicle;
    private GPS gps;

    // Vehicle is mandatory, GPS is optional
    @Autowired
    public void setVehicle(Vehicle vehicle) {
        this.vehicle = vehicle;
    }

    @Autowired
    @Optional
    public void setGps(GPS gps) {
        this.gps = gps;
    }

    public void startJourney() {
        vehicle.drive();
        if (gps != null) {
            gps.navigate();
        } else {
            System.out.println("No GPS available");
        }
    }
}

Step 3: Spring Configuration

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

Step 4: Spring Context থেকে Bean ব্যবহার করা

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Driver driver = context.getBean(Driver.class);
        driver.startJourney(); // Output: Driving a car, No GPS available
    }
}

এখানে, GPS Bean ইনজেক্ট করার জন্য @Optional ব্যবহার করা হয়েছে। যদি GPS Bean স্প্রিং কন্টেইনারে উপস্থিত না থাকে, তবে gps null হবে এবং একটি ডিফল্ট বার্তা "No GPS available" প্রদর্শিত হবে।


সারাংশ

  • @Primary অ্যানোটেশন ব্যবহৃত হয় যখন একাধিক Bean একই টাইপের থাকে এবং স্পষ্টভাবে ডিফল্ট Bean নির্বাচন করতে হয়।
  • @Optional অ্যানোটেশন বা Optional<T> টাইপ ব্যবহার করে একটি Bean ইনজেক্ট করার ক্ষেত্রে ঐচ্ছিক ডিপেনডেন্সি তৈরি করা যায়। যদি ঐচ্ছিক Bean উপলব্ধ না থাকে, তখন কোনো সমস্যা হবে না এবং এটি null থাকবে।
  • Primary Bean Injection ব্যবহারের মাধ্যমে স্প্রিং কন্টেইনার ডিফল্ট Bean নির্বাচন করতে পারে, যখন একাধিক Bean একই টাইপের থাকে।
  • Optional Bean Injection ব্যবহৃত হয় যেখানে Bean ঐচ্ছিক থাকে এবং এটি উপস্থিত না থাকলেও অ্যাপ্লিকেশন সঠিকভাবে কাজ করবে।

Content added By
Promotion

Are you sure to start over?

Loading...