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 Interface এ componentModel = "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 এর সুবিধা এবং ভূমিকা
- Simplifies Dependency Management: CDI ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে। MapStruct কে CDI কন্টেইনারে ইনজেক্ট করার মাধ্যমে কোডের নমনীয়তা এবং পরিচালনাযোগ্যতা বৃদ্ধি পায়।
- Life Cycle Management: CDI কন্টেইনার অবজেক্টের জীবনচক্র পরিচালনা করতে সহায়তা করে, যা একাধিক সিস্টেমে পুনরায় ব্যবহৃত হতে পারে।
- Loose Coupling: CDI ডিপেনডেন্সি ইনজেকশন ব্যবহার করে কোডের মধ্যে লুজ কপ্লিং তৈরি করে, ফলে একাধিক সিস্টেমের মধ্যে কমপ্লেক্স কোড ডিপেনডেন্সি থেকে রক্ষা পাওয়া যায়।
- Automatic Injection: CDI এর মাধ্যমে MapStruct ম্যাপার ক্লাসগুলো স্বয়ংক্রিয়ভাবে ইনজেক্ট করা যেতে পারে, যা কোডের গঠন সহজ এবং পরিষ্কার রাখে।
৪. MapStruct এবং CDI Integration এর সুবিধা
- Code Reusability: CDI কন্টেইনারের মাধ্যমে MapStruct ম্যাপার ক্লাসগুলো একাধিক জায়গায় পুনরায় ব্যবহার করা সম্ভব।
- Testability: CDI কন্টেইনারের মাধ্যমে MapStruct এর মেপিং ফাংশনগুলো সহজে ইউনিট টেস্ট করা যায়।
- Improved Maintainability: কোডে লজিক এবং ডিপেনডেন্সি ক্লিয়ারলি আলাদা করার মাধ্যমে এটি মেইনটেন্যান্স সহজ করে তোলে।
- Simplified Configuration: CDI কন্টেইনারের মাধ্যমে MapStruct ইনস্ট্যান্সগুলি সহজেই কনফিগার করা যায়, যা কোডের পোর্টেবিলিটি এবং কনফিগারেশন সহজ করে তোলে।
৫. MapStruct এবং CDI এর মধ্যে ব্যবহারের ক্ষেত্রে কিছু টিপস
- Component Model Configuration: MapStruct এর Mapper ইন্টারফেসে
componentModel = "cdi"ঠিকভাবে কনফিগার করুন, যাতে এটি CDI কন্টেইনারে Bean হিসেবে কার্যকরী হয়। - Circular Dependencies: CDI ব্যবহার করার সময় circular dependency (যেমন একাধিক Bean একে অপরের ওপর নির্ভরশীল) এড়ানোর জন্য সতর্ক থাকুন। এ ধরনের সমস্যা সমাধানে @Produces এবং @Inject যথাযথভাবে ব্যবহার করুন।
- Scope Management: CDI এর স্কোপ (Request, Session, Singleton ইত্যাদি) নির্ধারণ করে যাতে MapStruct Bean এর জীবনচক্রের সাথে সঙ্গতিপূর্ণভাবে কাজ করতে পারে।
সারাংশ
CDI (Contexts and Dependency Injection) একটি শক্তিশালী ফিচার যা Java EE এ ডিপেনডেন্সি ইনজেকশন এবং অবজেক্ট লাইফসাইকেল ম্যানেজমেন্টের কাজ সহজ করে তোলে। MapStruct এর সাথে CDI ইন্টিগ্রেট করে আপনি MapStruct ম্যাপার ক্লাসগুলোকে সহজে Spring বা CDI কন্টেইনারের Bean হিসেবে ব্যবহার করতে পারেন। এটি ডিপেনডেন্সি ইনজেকশন এবং ম্যাপিং কোড ব্যবস্থাপনা সহজ করে তোলে, এবং কোডের নমনীয়তা এবং মেইনটেন্যান্স বৃদ্ধি করে। CDI এবং MapStruct এর ইন্টিগ্রেশন উন্নত কোড ডিজাইন এবং টেস্টিং সক্ষম করে।
Read more