मैं कुछ समय से स्प्रिंग में डिपेंडेंसी इंजेक्शन का उपयोग कर रहा हूं, और मैं समझता हूं कि यह कैसे काम करता है और इसका उपयोग करने के कुछ नियम और विपक्ष क्या हैं। हालांकि, जब मैं एक नया वर्ग बना रहा हूं तो मुझे अक्सर आश्चर्य होता है - क्या इस वर्ग को स्प्रिंग आईओसी कंटेनर द्वारा प्रबंधित किया जाना चाहिए?
और मैं @Autowired एनोटेशन, XML कॉन्फ़िगरेशन, सेटर इंजेक्शन, कंस्ट्रक्टर इंजेक्शन, आदि के बीच मतभेदों के बारे में बात नहीं करना चाहता। मेरा सवाल एक सामान्य है।
मान लें कि हमारे पास एक कनवर्टर के साथ एक सेवा है:
@Service
public class Service {
@Autowired
private Repository repository;
@Autowired
private Converter converter;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
return converter.mapToDto(cars);
}
}
@Component
public class Converter {
public CarDto mapToDto(List<Car> cars) {
return new ArrayList<CarDto>(); // do the mapping here
}
}
स्पष्ट रूप से, कनवर्टर की कोई निर्भरता नहीं है, इसलिए इसके लिए आवश्यक नहीं है कि यह स्वत: संचालित हो। लेकिन मेरे लिए यह उतना ही बेहतर लगता है जितना कि ऑटोवेयर्ड। कोड क्लीनर और परीक्षण करने में आसान है। यदि मैं इस कोड को DI के बिना लिखता हूं, तो सेवा इस तरह दिखाई देगी:
@Service
public class Service {
@Autowired
private Repository repository;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
Converter converter = new Converter();
return converter.mapToDto(cars);
}
}
अब इसे परखना ज्यादा कठिन है। इसके अलावा, हर कन्वर्टर ऑपरेशन के लिए नया कन्वर्टर बनाया जाएगा, भले ही वह हमेशा एक ही स्थिति में हो, जो ओवरहेड जैसा लगता है।
स्प्रिंग एमवीसी में कुछ प्रसिद्ध पैटर्न हैं: रिपॉजिटरी का उपयोग करके सेवाओं और सेवाओं का उपयोग करने वाले नियंत्रक। फिर, यदि रिपॉजिटरी को ऑटोवॉयर किया जाता है (जो कि आमतौर पर होता है), तो सर्विस को भी ऑटोवॉयर करना पड़ता है। और यह काफी स्पष्ट है। लेकिन हम @Component एनोटेशन का उपयोग कब करते हैं? यदि आपके पास कुछ स्थिर उपयोग कक्षाएं (जैसे कन्वर्टर्स, मैपर्स) हैं - तो क्या आप उन्हें ऑटो करते हैं?
क्या आप सभी वर्गों को स्वावलंबी बनाने की कोशिश करते हैं? फिर सभी वर्ग निर्भरताएं इंजेक्ट करना आसान है (एक बार फिर से, समझने में आसान और परीक्षण करने में आसान)। या क्या आप केवल तभी ऑटो करना चाहते हैं जब यह बिल्कुल आवश्यक हो?
मैंने कुछ समय बिताया है जब ऑटोवायरिंग का उपयोग करने के लिए कुछ सामान्य नियमों की तलाश की गई थी, लेकिन मुझे कोई विशेष सुझाव नहीं मिला। आमतौर पर, लोग "क्या आप DI का उपयोग करते हैं? (हां / नहीं)" या "आप किस प्रकार की निर्भरता इंजेक्शन पसंद करते हैं" के बारे में बात करते हैं, जो मेरे सवाल का जवाब नहीं देता है।
मैं इस विषय से संबंधित किसी भी सुझाव के लिए आभारी रहूंगा!