MapStruct এবং CDI (Contexts and Dependency Injection)

Java Technologies - ম্যাপস্ট্রাক্ট (MapStruct)
80
80

MapStruct একটি শক্তিশালী Java annotation processor যা POJOs (Plain Old Java Objects) এর মধ্যে ম্যাপিং প্রক্রিয়া সহজ এবং দ্রুত করে তোলে। CDI (Contexts and Dependency Injection) হল Java EE (Enterprise Edition) এর একটি অংশ যা ডিপেনডেন্সি ইনজেকশন, কনটেক্সট ম্যানেজমেন্ট এবং এলিভেশন সম্পর্কিত সুবিধা প্রদান করে।

MapStruct এবং CDI একসাথে ব্যবহার করা যেতে পারে, যা আপনাকে স্বয়ংক্রিয়ভাবে MapStruct এর ম্যাপিং ফাংশনালিটি Spring বা Java EE কনটেক্সটে ইনজেক্ট করতে সহায়তা করে। এতে MapStruct মেপিং ফাংশনগুলি CDI কনটেক্সটে একটি Spring Bean বা CDI Bean হিসেবে ইনজেক্ট করা সম্ভব হয়।

১. CDI Overview

Contexts and Dependency Injection (CDI) হল একটি কনটেইনার ভিত্তিক ডিপেনডেন্সি ইনজেকশন ফ্রেমওয়ার্ক যা Java EE অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়। CDI প্রধানত তিনটি কাজ সম্পাদন করে:

  1. Dependency Injection: এটি নির্দিষ্ট ক্লাসগুলিতে স্বয়ংক্রিয়ভাবে ডিপেনডেন্সি ইনজেক্ট করে।
  2. Context Management: বিভিন্ন কনটেক্সট যেমন, অ্যাপ্লিকেশন, সেশন বা রিকোয়েস্ট স্তরে অবজেক্ট লাইফসাইকেল পরিচালনা করা।
  3. Interceptors and Decorators: মেথড কল এবং অবজেক্টের আচরণকে কাস্টমাইজ করার জন্য ব্যবহার করা হয়।

২. MapStruct এবং CDI ইন্টিগ্রেশন

MapStruct এবং CDI একসাথে ব্যবহৃত হলে, MapStruct মাপিং ইন্টারফেসগুলিকে CDI Beans হিসেবে তৈরি করা যায়, যা Spring Beans এর মত স্বয়ংক্রিয়ভাবে ইনজেক্ট করা সম্ভব হয়। এটি একটি খুবই কার্যকরী পদ্ধতি, বিশেষত যখন আপনাকে MapStruct এর মেপিং কোডকে CDI কনটেইনারে ব্যবহার করতে হয়।

CDI এর সাথে MapStruct ইন্টিগ্রেশন:

যখন আপনি MapStruct কে CDI (Contexts and Dependency Injection) সাথে ব্যবহার করতে চান, তখন আপনাকে componentModel = "cdi" কনফিগারেশন ব্যবহার করতে হবে। এটি CDI কনটেইনারে MapStruct মেথডকে একটি Bean হিসেবে ইনজেক্ট করে।

৩. MapStruct এবং CDI এর ব্যবহার উদাহরণ

এখানে একটি উদাহরণ দেয়া হলো যেখানে MapStruct এবং CDI একসাথে ব্যবহার করা হয়েছে।

৩.১ MapStruct CDI Integration Example

ধরা যাক, আমাদের দুটি JavaBean রয়েছে: Person এবং PersonDTO, এবং আমরা তাদের মধ্যে ম্যাপিং করতে চাই। আমরা MapStruct কে CDI Beans হিসেবে ব্যবহার করব।

Person.java (Domain Object):

public class Person {
    private String name;
    private int age;

    // Getters and Setters
}

PersonDTO.java (DTO):

public class PersonDTO {
    private String name;
    private int age;

    // Getters and Setters
}

PersonMapper.java (MapStruct Mapper Interface):

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "cdi")
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    PersonDTO personToPersonDTO(Person person);
}

এখানে, componentModel = "cdi" কনফিগারেশনটি ব্যবহার করে আমরা MapStruct Mapper কে CDI Bean হিসেবে তৈরি করেছি, যাতে এটি CDI কনটেইনারে সহজে ইনজেক্ট করা যায়।

৩.২ CDI Bean Usage Example

CDI এর মাধ্যমে PersonMapper ইনজেক্ট করা এবং ব্যবহার করা:

import javax.inject.Inject;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class PersonService {

    @Inject
    private PersonMapper personMapper;

    public PersonDTO convertPersonToDTO(Person person) {
        return personMapper.personToPersonDTO(person);
    }
}

এখানে, @Inject অ্যানোটেশন ব্যবহার করে PersonMapper কে CDI কনটেইনার থেকে ইনজেক্ট করা হয়েছে। এতে, MapStruct এর personToPersonDTO মেথড CDI Bean হিসেবে ব্যবহার করা সম্ভব হয়েছে।


৪. MapStruct এবং CDI এর সুবিধা

  1. Seamless Integration: MapStruct কে CDI কনটেইনারে Bean হিসেবে ব্যবহার করা যায়, যা ব্যবহারের ক্ষেত্রে খুবই সুবিধাজনক এবং সহজ।
  2. Decoupling: MapStruct ম্যাপিং লজিক এবং CDI এর মধ্যে ডিপেনডেন্সি ইনজেকশন প্রক্রিয়া আলাদা করা যায়, যা কোডের ক্লিনলিনেস এবং পুনঃব্যবহারযোগ্যতা বাড়ায়।
  3. Automatic Injection: MapStruct Mapper ফাংশন CDI কনটেইনারে অটোমেটিক্যালি ইনজেক্ট হয়ে যায়, ফলে ম্যানুয়ালি ডিপেনডেন্সি ম্যানেজ করতে হয় না।
  4. Compile-time Code Generation: MapStruct কেবল compile-time এ কোড জেনারেট করে, যা দ্রুত এবং রানটাইম পারফরম্যান্সে সাহায্য করে।
  5. Flexible Mapping: আপনি MapStruct কে CDI এর মাধ্যমে বিভিন্ন কনটেক্সটে ব্যবহার করতে পারেন, এবং কাস্টম ম্যাপিং এর মাধ্যমে আরও জটিল ডেটা ট্রান্সফরমেশন পরিচালনা করতে পারেন।

৫. CDI Beans এর জন্য MapStruct সঠিকভাবে কনফিগার করা

MapStruct ব্যবহার করার সময় CDI Beans এর জন্য MapStruct কে সঠিকভাবে কনফিগার করা গুরুত্বপূর্ণ। componentModel = "cdi" কনফিগারেশন CDI কনটেইনারের সাথে ইন্টিগ্রেশন সমর্থন করে এবং Spring Bean এর মতো কাজ করে।

@Mapper(componentModel = "cdi")
public interface PersonMapper {
    PersonDTO personToPersonDTO(Person person);
}

এখানে, componentModel = "cdi" মানে হল যে MapStruct এর মাধ্যমে তৈরি করা মেপিং ইন্টারফেসটি CDI কনটেইনারের মধ্যে ইনজেক্ট হতে সক্ষম।


৬. CDI এবং MapStruct এর সমন্বয় ব্যবহার করার সুবিধা

  1. Spring Boot Compatibility: CDI এবং MapStruct একসাথে ব্যবহার করার মাধ্যমে আপনি Spring Boot এ একই রকম সুবিধা পেতে পারেন।
  2. Automatic Bean Injection: CDI কনটেইনার ম্যানেজমেন্ট সুবিধা দিয়ে Bean স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে সাহায্য করে।
  3. Testable and Maintainable Code: যখন আপনি MapStruct কে CDI এর সাথে ইন্টিগ্রেট করেন, তখন আপনার কোড আরও সহজে টেস্টযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হয়ে ওঠে, কারণ প্রতিটি মডিউল পৃথকভাবে ব্যবহৃত এবং পরীক্ষা করা যায়।

সারাংশ

MapStruct এবং CDI (Contexts and Dependency Injection) একত্রে ব্যবহৃত হলে MapStruct এর মাধ্যমে তৈরি করা মেপিং ইন্টারফেসগুলো CDI Beans হিসেবে ইনজেক্ট করা যায়। এটি আপনাকে Java EE বা Spring অ্যাপ্লিকেশনগুলিতে ডিপেনডেন্সি ইনজেকশন সুবিধা নিয়ে মডেল মাপিংয়ের কাজ আরও সহজ এবং কার্যকরী করে তোলে। এর মাধ্যমে MapStruct এর ম্যাপিং মেথডগুলি সহজে CDI কনটেইনারে ব্যবহৃত হতে পারে এবং automatic dependency injection এর সুবিধা পাওয়া যায়।


Content added By

CDI কি এবং এর ভূমিকা

95
95

CDI (Contexts and Dependency Injection) হল একটি Java EE (Enterprise Edition) ফিচার যা ডিপেনডেন্সি ইনজেকশন, স্কোপ, এবং জীবনচক্র পরিচালনা করার জন্য ব্যবহৃত হয়। এটি Java EE ফ্রেমওয়ার্কের অংশ এবং Java SE (Standard Edition) এও ব্যবহার করা যায়। CDI ডিপেনডেন্সি ইনজেকশন (DI) ব্যবস্থার মাধ্যমে অবজেক্ট তৈরি, ম্যানেজমেন্ট এবং তার জীবনচক্র নিয়ন্ত্রণে সহায়তা করে, যা সফটওয়্যার ডেভেলপমেন্টে নমনীয়তা এবং মডুলারিটি বৃদ্ধি করে।

MapStruct এর মাধ্যমে CDI ব্যবহারের ফলে, MapStruct এর মাপিং ফাংশনগুলো সহজেই CDI কন্টেইনারের মাধ্যমে ম্যানেজ করা এবং ইনজেক্ট করা সম্ভব হয়। এটি MapStruct মেপারগুলোর স্বয়ংক্রিয়ভাবে Spring বা CDI কন্টেইনারের মধ্যে যুক্ত হওয়ার সুবিধা দেয়।


১. CDI এর ধারণা

CDI হল Java-এর একটি স্পেসিফিকেশন যা dependency injection এবং contextual lifecycle management-কে সমর্থন করে। এটি ক্লাসগুলির মধ্যে ডিপেনডেন্সি ইনজেকশন সহজ করে এবং অবজেক্টগুলির জন্য scoping এবং lifecycle management সরবরাহ করে। এই প্রক্রিয়ায়, নির্দিষ্ট অবজেক্টগুলি injected বা ম্যানেজড হয়, যার মাধ্যমে এক্সপ্লিসিট কনফিগারেশন কমে এবং কোডে নমনীয়তা আসে।


২. MapStruct এবং CDI Integration

MapStruct-এর সাথে CDI ইন্টিগ্রেশন করার মাধ্যমে আপনি MapStruct এর Mapper ক্লাসগুলিকে CDI কন্টেইনারের অংশ হিসেবে ব্যবহার করতে পারেন। সাধারণত MapStruct ব্যবহারকারীরা MapStruct এর Mapper Interface তৈরি করেন, যেগুলিকে Spring বা CDI কন্টেইনারের মাধ্যমে ইনজেক্ট করা যেতে পারে। componentModel = "cdi" কনফিগারেশন ব্যবহার করে MapStruct এর মেপার ক্লাসগুলো CDI কন্টেইনারের Bean হিসেবে কাজ করে এবং তা ইনজেক্ট করা যায়।

২.১ MapStruct এবং CDI Integration Example

MapStruct এর সাথে CDI ইন্টিগ্রেট করার জন্য আপনাকে Mapper InterfacecomponentModel = "cdi" ব্যবহার করতে হবে। এটি MapStruct কে CDI কন্টেইনারে স্বয়ংক্রিয়ভাবে যুক্ত করতে সাহায্য করে।

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper(componentModel = "cdi")
public interface EmployeeMapper {
    @Mapping(source = "name", target = "fullName")
    EmployeeDTO employeeToEmployeeDTO(Employee employee);
}

এখানে, componentModel = "cdi" দ্বারা EmployeeMapper কে CDI Bean হিসেবে ঘোষণা করা হয়েছে। এর মাধ্যমে আপনি EmployeeMapper ইনজেক্ট করতে পারবেন।

২.২ CDI কন্টেইনারের মাধ্যমে MapStruct Mapper ব্যবহার

MapStruct Mapper ক্লাসটি CDI কন্টেইনারের Bean হিসেবে কাজ করার কারণে এটি সরাসরি @Inject দিয়ে ইনজেক্ট করা যেতে পারে।

import javax.inject.Inject;

public class EmployeeService {

    @Inject
    private EmployeeMapper employeeMapper;

    public EmployeeDTO convertToDTO(Employee employee) {
        return employeeMapper.employeeToEmployeeDTO(employee);
    }
}

এখানে, @Inject দিয়ে EmployeeMapper কে CDI কন্টেইনার থেকে ইনজেক্ট করা হয়েছে। এটি Spring এর @Autowired এর মতোই কাজ করে।


৩. CDI এর সুবিধা এবং ভূমিকা

  1. Simplifies Dependency Management: CDI ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে। MapStruct কে CDI কন্টেইনারে ইনজেক্ট করার মাধ্যমে কোডের নমনীয়তা এবং পরিচালনাযোগ্যতা বৃদ্ধি পায়।
  2. Life Cycle Management: CDI কন্টেইনার অবজেক্টের জীবনচক্র পরিচালনা করতে সহায়তা করে, যা একাধিক সিস্টেমে পুনরায় ব্যবহৃত হতে পারে।
  3. Loose Coupling: CDI ডিপেনডেন্সি ইনজেকশন ব্যবহার করে কোডের মধ্যে লুজ কপ্লিং তৈরি করে, ফলে একাধিক সিস্টেমের মধ্যে কমপ্লেক্স কোড ডিপেনডেন্সি থেকে রক্ষা পাওয়া যায়।
  4. Automatic Injection: CDI এর মাধ্যমে MapStruct ম্যাপার ক্লাসগুলো স্বয়ংক্রিয়ভাবে ইনজেক্ট করা যেতে পারে, যা কোডের গঠন সহজ এবং পরিষ্কার রাখে।

৪. MapStruct এবং CDI Integration এর সুবিধা

  • Code Reusability: CDI কন্টেইনারের মাধ্যমে MapStruct ম্যাপার ক্লাসগুলো একাধিক জায়গায় পুনরায় ব্যবহার করা সম্ভব।
  • Testability: CDI কন্টেইনারের মাধ্যমে MapStruct এর মেপিং ফাংশনগুলো সহজে ইউনিট টেস্ট করা যায়।
  • Improved Maintainability: কোডে লজিক এবং ডিপেনডেন্সি ক্লিয়ারলি আলাদা করার মাধ্যমে এটি মেইনটেন্যান্স সহজ করে তোলে।
  • Simplified Configuration: CDI কন্টেইনারের মাধ্যমে MapStruct ইনস্ট্যান্সগুলি সহজেই কনফিগার করা যায়, যা কোডের পোর্টেবিলিটি এবং কনফিগারেশন সহজ করে তোলে।

৫. MapStruct এবং CDI এর মধ্যে ব্যবহারের ক্ষেত্রে কিছু টিপস

  1. Component Model Configuration: MapStruct এর Mapper ইন্টারফেসে componentModel = "cdi" ঠিকভাবে কনফিগার করুন, যাতে এটি CDI কন্টেইনারে Bean হিসেবে কার্যকরী হয়।
  2. Circular Dependencies: CDI ব্যবহার করার সময় circular dependency (যেমন একাধিক Bean একে অপরের ওপর নির্ভরশীল) এড়ানোর জন্য সতর্ক থাকুন। এ ধরনের সমস্যা সমাধানে @Produces এবং @Inject যথাযথভাবে ব্যবহার করুন।
  3. Scope Management: CDI এর স্কোপ (Request, Session, Singleton ইত্যাদি) নির্ধারণ করে যাতে MapStruct Bean এর জীবনচক্রের সাথে সঙ্গতিপূর্ণভাবে কাজ করতে পারে।

সারাংশ

CDI (Contexts and Dependency Injection) একটি শক্তিশালী ফিচার যা Java EE এ ডিপেনডেন্সি ইনজেকশন এবং অবজেক্ট লাইফসাইকেল ম্যানেজমেন্টের কাজ সহজ করে তোলে। MapStruct এর সাথে CDI ইন্টিগ্রেট করে আপনি MapStruct ম্যাপার ক্লাসগুলোকে সহজে Spring বা CDI কন্টেইনারের Bean হিসেবে ব্যবহার করতে পারেন। এটি ডিপেনডেন্সি ইনজেকশন এবং ম্যাপিং কোড ব্যবস্থাপনা সহজ করে তোলে, এবং কোডের নমনীয়তা এবং মেইনটেন্যান্স বৃদ্ধি করে। CDI এবং MapStruct এর ইন্টিগ্রেশন উন্নত কোড ডিজাইন এবং টেস্টিং সক্ষম করে।


Content added By

CDI এর মাধ্যমে MapStruct ব্যবহার

85
85

MapStruct একটি কোড জেনারেশন লাইব্রেরি যা Java ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং সরবরাহ করে। এটি compile-time এ কোড জেনারেট করে এবং কোড পারফরম্যান্সে উন্নতি আনে। CDI (Contexts and Dependency Injection) হল একটি Java EE ফিচার যা dependency injection এর মাধ্যমে অবজেক্ট এবং সেবা গুলি ইন্সট্যানশিয়েট এবং ম্যানেজ করতে সহায়তা করে। MapStruct এবং CDI একসাথে ব্যবহার করলে আপনি সহজেই MapStruct Mapper অবজেক্টগুলিকে CDI কনটেইনারে সংযুক্ত করে ম্যাপিং কাজটি করতে পারেন।

এই টিউটোরিয়ালে, আমরা দেখব কিভাবে CDI (Contexts and Dependency Injection) এর মাধ্যমে MapStruct ব্যবহার করা যায়।


১. CDI এবং MapStruct এর সাথে কাজ করা

MapStruct ব্যবহার করার সময়, আপনি যখন Spring বা CDI ফ্রেমওয়ার্ক ব্যবহার করেন, তখন MapStruct এর componentModel = "cdi" কনফিগারেশন ব্যবহার করে MapStruct কে CDI কনটেইনারে ইনজেক্ট করতে পারেন।

১.১ CDI Integration for MapStruct

MapStruct কে CDI এর মাধ্যমে ব্যবহার করতে, আপনার Mapper InterfacecomponentModel = "cdi" অ্যাট্রিবিউট যুক্ত করতে হবে। এর মাধ্যমে MapStruct নিজে CDI কনটেইনারের মধ্যে Bean হিসেবে রেজিস্টার হয়ে যাবে এবং এটিকে স্বয়ংক্রিয়ভাবে @Inject এর মাধ্যমে ইন্সট্যানশিয়েট করা যাবে।


২. CDI তে MapStruct ব্যবহার করার উদাহরণ

ধরা যাক আমাদের দুটি অবজেক্ট রয়েছে: Person এবং PersonDTO, এবং আমরা CDI এর মাধ্যমে MapStruct ম্যাপিং তৈরি করতে চাই।

২.১ Person.java (Domain Object)

public class Person {
    private String name;
    private int age;

    // Getters and Setters
}

২.২ PersonDTO.java (DTO Object)

public class PersonDTO {
    private String name;
    private int age;

    // Getters and Setters
}

২.৩ PersonMapper.java (MapStruct Mapper Interface)

এখানে, componentModel = "cdi" কনফিগারেশন সহ MapStruct Mapper Interface তৈরি করা হয়েছে। এটি CDI কনটেইনারে ইনজেক্ট হতে সক্ষম।

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "cdi")
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    PersonDTO personToPersonDTO(Person person);
}

এখানে, @Mapper(componentModel = "cdi") ব্যবহার করা হয়েছে, যা MapStruct কে CDI কনটেইনারের মধ্যে রেজিস্টার করতে সহায়তা করে।

২.৪ CDI কনটেইনারের মধ্যে ব্যবহার

এখন, আপনি এই Mapper ইন্টারফেসটি CDI কনটেইনারে ইনজেক্ট করতে পারবেন। নিচে একটি CDI Bean ব্যবহার করে PersonMapper ইনজেক্ট করা হয়েছে:

import javax.inject.Inject;

public class PersonService {

    @Inject
    private PersonMapper personMapper;

    public PersonDTO convertPersonToDTO(Person person) {
        return personMapper.personToPersonDTO(person);
    }
}

এখানে, @Inject অ্যানোটেশন ব্যবহার করা হয়েছে, যার মাধ্যমে CDI কনটেইনার স্বয়ংক্রিয়ভাবে PersonMapper কে ইনজেক্ট করবে এবং ম্যাপিং প্রক্রিয়া সম্পন্ন করবে।


৩. CDI (Contexts and Dependency Injection) সম্পর্কে সংক্ষেপে

CDI (Contexts and Dependency Injection) Java EE বা Jakarta EE এর একটি ফিচার, যা dependency injection (DI) এবং context management এর মাধ্যমে অবজেক্ট এবং সেবা ইনজেক্ট করে। CDI-র মাধ্যমে আপনি অবজেক্টের lifecycle এবং dependencies সহজে ম্যানেজ করতে পারেন, যা কোডের রিয়ুসেবিলিটি, টেস্টেবিলিটি এবং রিডেবিলিটি বৃদ্ধি করে।


৪. CDI-র মাধ্যমে MapStruct এর সুবিধা

  • Seamless Integration: CDI কনটেইনারের মাধ্যমে MapStruct কে সহজে ইনজেক্ট করা যায় এবং এর কার্যকারিতা বাড়ানো যায়।
  • No Manual Instantiation: CDI কনটেইনার স্বয়ংক্রিয়ভাবে MapStruct Mapper Bean ইন্সট্যানশিয়েট করে, ফলে ম্যানুয়াল ইনস্ট্যানশিয়েশন থেকে রক্ষা পাওয়া যায়।
  • Testability: CDI ফ্রেমওয়ার্ক ব্যবহারের ফলে কোড টেস্টিং এবং মকিং সহজ হয়, বিশেষ করে ইনজেক্ট করা অবজেক্টের মাধ্যমে।

৫. MapStruct এবং CDI ব্যবহারের জন্য প্রয়োজনীয় ডিপেনডেন্সি

MapStruct এবং CDI এর মাধ্যমে ম্যাপিং ব্যবহারের জন্য কিছু অতিরিক্ত ডিপেনডেন্সি আপনার pom.xml বা build.gradle ফাইলে যোগ করতে হবে।

৫.১ Maven Dependency (MapStruct and CDI)

<dependencies>
    <!-- MapStruct Dependency -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.2.Final</version>
    </dependency>

    <!-- MapStruct Processor Dependency for compile-time code generation -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.5.2.Final</version>
        <scope>provided</scope>
    </dependency>

    <!-- CDI Dependency (if not already included) -->
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>2.0</version>
    </dependency>
</dependencies>

৫.২ Gradle Dependency (MapStruct and CDI)

dependencies {
    // MapStruct Dependency
    implementation 'org.mapstruct:mapstruct:1.5.2.Final'

    // MapStruct Processor for compile-time code generation
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.2.Final'

    // CDI Dependency
    implementation 'javax.enterprise:cdi-api:2.0'
}

৬. সারাংশ

MapStruct এবং CDI একত্রে ব্যবহারের মাধ্যমে আপনি Java প্রোজেক্টে অটোমেটিক ম্যাপিং এবং ডিপেনডেন্সি ইনজেকশন সুবিধা পেতে পারেন। MapStruct এর componentModel = "cdi" কনফিগারেশনের মাধ্যমে এটি CDI কনটেইনারে রেজিস্টার করা যায় এবং @Inject অ্যানোটেশন ব্যবহার করে আপনি CDI কনটেইনার থেকে MapStruct Mapper ইনজেক্ট করতে পারেন। এই ইন্টিগ্রেশনটি কোডে সহজ এবং কার্যকরী ম্যাপিং সল্যুশন প্রদান করে এবং কোড রিয়ুসেবিলিটি ও টেস্টেবিলিটি উন্নত করে।


Content added By

@Mapper(componentModel = "cdi") এর ব্যবহার

73
73

MapStruct একটি কোড জেনারেটর যা Java Beans (POJOs) এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং করে থাকে। MapStruct এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল componentModel সেটিং, যা আপনাকে MapStruct Mapper এর সাথে বিভিন্ন ফ্রেমওয়ার্কে ইন্টিগ্রেট করার সুবিধা দেয়। এর মধ্যে একটি জনপ্রিয় ইন্টিগ্রেশন হল CDI (Contexts and Dependency Injection), যা Java EE বা Jakarta EE অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়।

@Mapper(componentModel = "cdi") ব্যবহার করার মাধ্যমে, আপনি আপনার MapStruct Mapper ক্লাসটিকে CDI কম্পোনেন্ট হিসেবে ব্যবহার করতে পারবেন। এটি মূলত CDI কনটেইনারের মাধ্যমে MapStruct Mapper এর ইন্সট্যান্স তৈরি করে, যা injection এর মাধ্যমে অন্যান্য ক্লাসে ব্যবহার করা যায়।


১. CDI কি?

CDI (Contexts and Dependency Injection) হল Java EE বা Jakarta EE এর একটি বৈশিষ্ট্য, যা ডিপেনডেন্সি ইনজেকশন (DI) সমর্থন করে। এটি অবজেক্ট ইনস্ট্যান্স এবং তাদের জীবনচক্রকে পরিচালনা করার একটি পদ্ধতি প্রদান করে। CDI ফিচারটি MapStruct এর সাথে ব্যবহার করলে, আপনি MapStruct Mapper ক্লাসগুলোকে CDI Bean হিসেবে ব্যবহার করতে পারবেন এবং এটি আপনার প্রোজেক্টে সহজে ইনজেক্ট করা যাবে।


২. @Mapper(componentModel = "cdi") ব্যবহার কেন প্রয়োজন?

CDI ব্যবহারের মাধ্যমে, আপনি MapStruct Mapper কে সহজেই CDI Context থেকে ইনস্ট্যান্স হিসেবে ইনজেক্ট করতে পারবেন, যেমন অন্যান্য Spring বা JEE Beans। এটি ব্যবহারের মাধ্যমে, আপনি আপনার Mapper ক্লাসগুলিকে আপনার প্রোজেক্টের অংশ হিসেবে ব্যবহার করতে পারেন যেখানে dependency injection ব্যবহৃত হয়, এবং MapStruct এর ফিচারগুলো Spring Bean বা JEE Beans হিসেবে পাওয়ার সুবিধা পাবেন।


৩. @Mapper(componentModel = "cdi") এর ব্যবহার

@Mapper(componentModel = "cdi") একটি অ্যানোটেশন যা MapStruct মাপার ক্লাসটিকে CDI কনটেইনারের সাথে সম্পর্কিত করে। যখন এই কনফিগারেশন ব্যবহার করা হয়, তখন MapStruct স্বয়ংক্রিয়ভাবে CDI কনটেইনারের মাধ্যমে ম্যাপার ক্লাসের একটি ইনস্ট্যান্স তৈরি করবে এবং আপনি এটি @Inject ব্যবহার করে যেকোনো ক্লাসে ইনজেক্ট করতে পারবেন।

উদাহরণ: @Mapper(componentModel = "cdi") এর ব্যবহার

ধরা যাক, আমাদের দুটি ক্লাস Person এবং PersonDTO আছে, এবং আমরা MapStruct ব্যবহার করে এই দুই ক্লাসের মধ্যে ডেটা ট্রান্সফার করতে চাই।

Person.java:

public class Person {
    private String name;
    private int age;

    // Getters and Setters
}

PersonDTO.java:

public class PersonDTO {
    private String fullName;
    private int age;

    // Getters and Setters
}

এখন, MapStruct ব্যবহার করে আমরা Person কে PersonDTO তে ম্যাপ করতে চাই, এবং @Mapper(componentModel = "cdi") ব্যবহার করে এই Mapper কে CDI Bean হিসেবে কনফিগার করব।

PersonMapper.java:

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "cdi")
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    PersonDTO personToPersonDTO(Person person);
}

এখানে, componentModel = "cdi" এর মাধ্যমে PersonMapper কে CDI Bean হিসেবে তৈরি করা হচ্ছে।


৪. CDI Context থেকে Mapper ইনজেক্ট করা

এখন, আপনি CDI কনটেইনার ব্যবহার করে PersonMapper ক্লাসটিকে যেকোনো ক্লাসে ইনজেক্ট করতে পারেন। এখানে @Inject ব্যবহার করা হবে।

PersonService.java:

import javax.inject.Inject;

public class PersonService {

    @Inject
    PersonMapper personMapper;

    public PersonDTO convertToDTO(Person person) {
        return personMapper.personToPersonDTO(person);
    }
}

এখানে, @Inject অ্যানোটেশন ব্যবহার করে আমরা PersonMapper ক্লাসটিকে PersonService ক্লাসে ইনজেক্ট করেছি। CDI কনটেইনার স্বয়ংক্রিয়ভাবে PersonMapper এর একটি ইনস্ট্যান্স তৈরি করবে।


৫. MapStruct CDI Integration এর সুবিধা

  1. Dependency Injection: MapStruct Mapper CDI কনটেইনারের সাথে ইন্টিগ্রেট হলে, আপনি সহজেই MapStruct Mapper ক্লাসগুলিকে আপনার প্রোজেক্টে injected করতে পারেন। এতে কোড সহজ এবং পরিষ্কার থাকে।
  2. Loose Coupling: MapStruct Mapper ক্লাসগুলোকে CDI কনটেইনারের সাথে সংযুক্ত করার মাধ্যমে আপনার কোডে loose coupling সৃষ্টি হয়, যা বজায় রাখতে এবং পরীক্ষা (testing) করতে সুবিধাজনক হয়।
  3. Managed Beans: CDI কনটেইনার দ্বারা MapStruct Mapper Bean গুলি পরিচালিত হবে, যা আপনাকে ম্যাপারগুলির জন্য scoped lifecycle এবং dependency injection সুবিধা প্রদান করবে।
  4. Integration with Java EE: MapStruct এবং CDI একসাথে কাজ করলে Java EE অ্যাপ্লিকেশনের মধ্যে ম্যাপিং প্রক্রিয়া সহজ হয়।

৬. Spring এবং CDI এর মধ্যে পার্থক্য

এমনকি MapStruct এর componentModel = "spring" এবং componentModel = "cdi" একই উদ্দেশ্যে ব্যবহৃত হয়, তবে তাদের ব্যবহারের প্রসঙ্গ ভিন্ন। Spring ব্যবহারের ক্ষেত্রে Spring কনটেইনারের মাধ্যমে ডিপেনডেন্সি ইনজেকশন করা হয়, যেখানে CDI হল Java EE বা Jakarta EE ফ্রেমওয়ার্কের অংশ এবং এর মাধ্যমে ডিপেনডেন্সি ইনজেকশন করা হয়।


সারাংশ

MapStruct এর মাধ্যমে @Mapper(componentModel = "cdi") ব্যবহারের মাধ্যমে আপনি আপনার Mapper ক্লাসগুলিকে CDI কনটেইনারের অংশ হিসেবে ইন্টিগ্রেট করতে পারেন। এটি dependency injection ব্যবহারে সাহায্য করে, এবং আপনাকে MapStruct Mapper ক্লাসগুলিকে সহজে CDI Bean হিসেবে ইনজেক্ট করতে দেয়। এটি Java EE বা Jakarta EE অ্যাপ্লিকেশনগুলিতে ব্যবহার করা হয়, যেখানে CDI কনটেইনারের মাধ্যমে ম্যানেজ করা হয়।


Content added By

উদাহরণ সহ CDI Integration

114
114

CDI (Contexts and Dependency Injection) একটি Java EE (Jakarta EE) স্পেসিফিকেশন যা ডিপেনডেন্সি ইনজেকশন এবং কনটেক্সট পরিচালনার জন্য ব্যবহৃত হয়। MapStruct এর সাথে CDI ইন্টিগ্রেশন সাধারণত Spring বা CDI Containers এর সাথে ব্যবহার করা হয়, যেখানে MapStruct Bean হিসেবে ব্যবহৃত হয় এবং CDI এর মাধ্যমে এটি স্বয়ংক্রিয়ভাবে ইনজেক্ট করা হয়।

এখানে, আমরা CDI Integration এর মাধ্যমে MapStruct এর উদাহরণ সহ ব্যবহারের পদ্ধতি দেখব।


১. MapStruct CDI Integration Overview

MapStruct এর সাথে CDI ইন্টিগ্রেশন আপনাকে MapStruct এর Mapper Interface কে CDI Beans হিসেবে ব্যবহারের সুবিধা দেয়। এর মানে হল যে আপনি আপনার প্রোজেক্টে CDI Container এর মাধ্যমে মেথডগুলো ইনজেক্ট করতে পারবেন এবং বিভিন্ন Scope এর মধ্যে ম্যাপিং ফাংশনালিটি ব্যবহার করতে পারবেন।

MapStruct এর CDI ইন্টিগ্রেশন সুবিধা:

  1. Automatic Dependency Injection: CDI ব্যবহার করে আপনার Mapper ইন্টারফেসকে স্বয়ংক্রিয়ভাবে ইনজেক্ট করা যায়।
  2. Decoupling: মডিউল এবং ক্লাসগুলির মধ্যে ডিপেনডেন্সি কমিয়ে আনে।
  3. Ease of Use: Spring বা JEE (Java EE) সাপোর্ট করে, যাতে নির্দিষ্ট ডিপেনডেন্সি ইনজেকশন কার্যকরী হয়।

২. MapStruct CDI Integration এর জন্য কনফিগারেশন

MapStruct CDI Integration করার জন্য, MapStruct Mapper ইন্টারফেসে componentModel = "cdi" যুক্ত করতে হয়, যা MapStruct কে CDI Bean হিসেবে কনফিগার করে। এর মাধ্যমে CDI Container এ MapStruct Mapper ইন্টারফেসটিকে স্বয়ংক্রিয়ভাবে ইনজেক্ট করা যাবে।

উদাহরণ: CDI Integration

২.১ CDI Mapper Interface কনফিগারেশন
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "cdi")
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
    
    PersonDTO personToPersonDTO(Person person);
}

এখানে, componentModel = "cdi" ব্যবহার করা হয়েছে যা MapStruct কে CDI Bean হিসেবে কনফিগার করে।

২.২ CDI Bean ইনজেকশন Example

CDI ব্যবহারের মাধ্যমে MapStruct Mapper ইনজেক্ট করার উদাহরণ:

import javax.inject.Inject;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class PersonService {

    @Inject
    private PersonMapper personMapper; // CDI এর মাধ্যমে MapStruct Mapper ইনজেক্ট করা হচ্ছে
    
    public PersonDTO convertToDTO(Person person) {
        return personMapper.personToPersonDTO(person);
    }
}

এখানে, PersonService ক্লাসে PersonMapper কে @Inject অ্যানোটেশন দিয়ে CDI এর মাধ্যমে ইনজেক্ট করা হয়েছে। এর মাধ্যমে PersonMapper কে PersonService এ ব্যবহার করা যাবে।


৩. CDI Managed Bean সিস্টেমে MapStruct ব্যবহার

আপনি CDI প্রোজেক্টে MapStruct ব্যবহার করতে চাইলে, প্রথমে componentModel = "cdi" ব্যবহার করে Mapper ইন্টারফেস কনফিগার করুন, তারপরে এটিকে CDI Bean হিসেবে ইনজেক্ট করুন। এই কনফিগারেশনটি EJB, CDI Managed Beans এবং JAX-RS বা Servlet এর মধ্যে ব্যবহৃত হতে পারে।

উদাহরণ: CDI Bean এ MapStruct এর ব্যবহার

  1. Person.java (Entity)
public class Person {
    private String name;
    private int age;

    // Getters and Setters
}
  1. PersonDTO.java (DTO)
public class PersonDTO {
    private String fullName;
    private int age;

    // Getters and Setters
}
  1. PersonMapper.java (MapStruct Mapper Interface)
import org.mapstruct.Mapper;

@Mapper(componentModel = "cdi")
public interface PersonMapper {
    PersonDTO personToPersonDTO(Person person);
}
  1. PersonService.java (CDI Bean)
import javax.inject.Inject;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class PersonService {

    @Inject
    private PersonMapper personMapper;

    public PersonDTO convertToDTO(Person person) {
        return personMapper.personToPersonDTO(person);
    }
}

এখানে, PersonMapper CDI এর মাধ্যমে PersonService ক্লাসে ইনজেক্ট করা হয়েছে এবং convertToDTO() মেথডে MapStruct এর মাধ্যমে ম্যাপিং করা হচ্ছে।


৪. CDI Container Configuration

MapStruct এর সাথে CDI Integration কার্যকর করার জন্য আপনার CDI Container যেমন Weld, OpenWebBeans, বা GlassFish এ কনফিগার করতে হবে। প্রোজেক্টে CDI ইন্টিগ্রেশন করার জন্য আপনাকে সঠিক CDI Implementation যোগ করতে হবে।

Maven Dependency for CDI:

<dependencies>
    <!-- CDI API Dependency -->
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>2.0</version>
    </dependency>
    
    <!-- CDI Implementation (Weld) Dependency -->
    <dependency>
        <groupId>org.jboss.weld.api</groupId>
        <artifactId>weld-api</artifactId>
        <version>3.1.6.Final</version>
    </dependency>
</dependencies>

এখানে, cdi-api এবং weld-api CDI সাপোর্ট করার জন্য প্রোজেক্টে অন্তর্ভুক্ত করা হয়েছে।


৫. MapStruct এবং CDI এর সুবিধা

  1. Automatic Dependency Injection: CDI ব্যবহার করে MapStruct Mapper ইন্টারফেসকে ইনজেক্ট করা যায়।
  2. Simplified Dependency Management: আপনি ম্যানুয়ালি ম্যাপার তৈরি বা ইনস্ট্যান্সিয়েট করার পরিবর্তে CDI ব্যবহার করে স্বয়ংক্রিয়ভাবে MapStruct ইনজেক্ট করতে পারবেন।
  3. Loose Coupling: এটি ক্লাসগুলির মধ্যে সুনির্দিষ্ট ডিপেনডেন্সি কমিয়ে আনে, যার ফলে কোড মেইন্টেনেন্স সহজ হয়।
  4. Scoped Beans: CDI Beans এর মাধ্যমে, MapStruct ইন্টারফেসের জন্য নির্দিষ্ট স্কোপ ব্যবহার করা যেতে পারে (যেমন RequestScoped, SessionScoped, বা ApplicationScoped)।

সারাংশ

MapStruct এর সাথে CDI Integration ব্যবহার করে আপনি স্বয়ংক্রিয়ভাবে MapStruct Mapper ইন্টারফেসকে CDI Beans হিসেবে ইন্টিগ্রেট করতে পারেন, যা আপনার প্রোজেক্টে ডিপেনডেন্সি ইনজেকশন সহজ করে তোলে। এটি MapStruct এর ম্যাপিং ক্ষমতা এবং CDI এর ডিপেনডেন্সি ইনজেকশন ফিচার একত্রিত করে এবং আপনাকে আরও পরিষ্কার এবং উন্নত কনফিগারেশন প্রদান করে। এই ইন্টিগ্রেশন বিশেষভাবে Java EE বা Jakarta EE ভিত্তিক অ্যাপ্লিকেশন ডেভেলপমেন্টে উপকারী।


Content added By
Promotion