में @autowired का उपयोग करें जैसा कि मुझे पता है, field injection
अनुशंसित नहीं है। इसके बजाय constructor
का उपयोग करना चाहिए।अमूर्त बेस क्लास
जो मैं यहां करने की कोशिश कर रहा हूं वह बेस क्लास के निर्माता में @Autowired
का उपयोग कर रहा है, और इसे सभी उप-वर्गों के लिए सुलभ बना देता है। कुछ उप-वर्गों में, मुझे अपने रचनाकारों से @Autowired
होने के लिए कुछ विशिष्ट बीन्स की भी आवश्यकता होती है। डेमो कोड निम्न प्रकार है:
बेस वर्ग:
public abstract class Base {
protected final MyDemoService myDemoService;
@Autowired
public Base(MyDemoService myDemoService) {
this.myDemoService = myDemoService;
}
}
पारंपरिक रूप से प्राप्त (उप) वर्ग:
public class Sub extends Base {
private final MySubService mySubService;
@Autowired
public Sub(MySubService mySubService) {
this.mySubService = mySubService;
}
}
यह मैं एक 'कोई डिफ़ॉल्ट निर्माता' त्रुटि दे देंगे।
यह प्रश्न के समान है: similar question and answer, लेकिन यह यहां काम नहीं करता है।
मैं थोड़ी देर के लिए इस में डुबकी लगाई है, मैं dependency injection
के बारे में इस लेख पाया: further read
मैं सोच रहा हूँ Setter Injection
मेरे सवाल के लिए एक सही तरीका है?
सेटर इंजेक्शन:
public abstract class Base {
protected MyDemoService myDemoService;
@Autowired
public void setMyDemoService(MyDemoService myDemoService) {
this.myDemoService = myDemoService;
}
}
मैं जावा स्प्रिंग बूट करने के लिए नए हूँ, और तुम लोगों से कुछ विशेषज्ञता सलाह प्राप्त करना चाहते हैं। किसी भी चर्चा की अत्यधिक सराहना की जाएगी!
मुझे लगता है कि सेटर आपका सबसे अच्छा विकल्प है, क्योंकि कन्स्ट्रक्टर चीज एक भाषा विनिर्देश है और स्प्रिंग'श – Mehdi
फील्ड इंजेक्शन की सिफारिश नहीं की जा रही है, एक सार्वभौमिक सत्य नहीं है। मैंने जो परियोजनाएं की हैं, हमने जानबूझकर इसका उपयोग करने का फैसला किया है ताकि बहुत सारे बॉयलरप्लेट कोड (कन्स्ट्रक्टर या सेटर्स जो केवल निर्भरताएं भरें) को बचा सकें जो रखरखाव या पठनीयता के लिए शून्य मान जोड़ता है। – john16384
@Mehdi आपकी प्रतिक्रिया के लिए धन्यवाद। – Vigor