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

Spring এর মাধ্যমে Primary এবং Optional Bean Injection - স্প্রিং ডিপেনডেন্সি ইনজেকশন (ডিআই) (Spring Dependency Injection) - Java Technologies

322

স্প্রিং ডিপেনডেন্সি ইনজেকশন (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
Promotion

Are you sure to start over?

Loading...