वसंत में कन्स्ट्रक्टर में autowired निर्भरता का उपयोग करना

मेरे पास क्लास NetworkUsageService है जो डेटाबेस एक्सेस करने के लिए NetworkUsageMapper का उपयोग करती है। मैपर वर्ग सेवा वर्ग के लिए स्वचालित है।

मुझे सर्विस क्लास की कोंस्त्रक्षण के दौरान डेटाबेस तक पहुंचने की ज़रूरत है, इसलिए मैं ऐसा कुछ करता हूं:

private int someField;    

@Autowired
private NetworkUsageMapper networkUsageMapper;


public NetworkUsageService() {
    someField = networkUsageMapper.getSomeResultFromDB();
}

हालांकि, ऐसा लगता है कि सेवा बीन बनाने के दौरान मुझे अपवाद मिलता है। किसी ऑब्जेक्ट के निर्माण के दौरान एक स्वाभाविक निर्भरता का उपयोग करने का कोई तरीका है?

संपादित करें: अनुरोध के रूप में यह मेरी बीन्स विन्यास है:









    
    
    



    




    
    
    
    

0
मैंने प्रश्न में अपनी बीन्स कॉन्फ़िगरेशन जोड़ा
जोड़ा लेखक Wolf, स्रोत
@ केरथी रमनथन: यह मेरे लिए करता है
जोड़ा लेखक Wolf, स्रोत
आपका नेटवर्क यूजमैपपर बीन कहां है?
जोड़ा लेखक Keerthivasan, स्रोत
क्या आप अपनी बीन्स कॉन्फ़िगरेशन पोस्ट कर सकते हैं?
जोड़ा लेखक Dropout, स्रोत

4 उत्तर

दूसरा तरीका @Uequired एनोटेशन के साथ एनोटेटेड NetworkUsageMapper के setterMethod को बनाना है

@Required
public void setNetworkUsageMapper(NetworkUsageMapper mapper){
this.networkUsageMapper = mapper;
this.someField = this.networkUsageMapper.getSomeResultFromDB();
}

ऑब्जेक्ट के निर्माण के बाद इस विधि को तत्काल अनिवार्य रूप से बुलाया जाएगा। यह वास्तव में उपयोगी होता है जब आपके पास ऑब्जेक्ट के ठीक से काम करने के लिए अनिवार्य गुणों की लंबी सूची होती है। लंबे पैरामीटर सूची के साथ कन्स्ट्रक्टर रखने के बजाय, हम @Required एनोटेशन के साथ सेटर्स का उपयोग करके सभी गुण सेट कर सकते हैं। ऐसा लगता है कि मेरे लिए बहुत आसान है।

0
जोड़ा
आपके उत्तर के लिए धन्यवाद, लेकिन जैसा कि आपने लिखा था: "इस विधि को ऑब्जेक्ट के निर्माण के तुरंत बाद अनिवार्य रूप से लागू किया जाएगा।" - मुझे वस्तु के निर्माण के दौरान निर्भरता का उपयोग करने की आवश्यकता है, निर्माण के बाद नहीं
जोड़ा लेखक Wolf, स्रोत
इससे पहले कि मैं इसे किसी अन्य चीज़ के लिए उपयोग करने से पहले डेटाबेस डेटा के साथ सेवा ऑब्जेक्ट का एक क्षेत्र पॉप्युलेट करना चाहता हूं
जोड़ा लेखक Wolf, स्रोत
ठीक है आप का स्वागत है। क्या मुझे पता है कि आपको इसकी आवश्यकता क्यों है?
जोड़ा लेखक Keerthivasan, स्रोत
मैंने सेवा ऑब्जेक्ट के क्षेत्र को सेट करने का उत्तर अपडेट किया है। उम्मीद है की यह मदद करेगा
जोड़ा लेखक Keerthivasan, स्रोत

यह सही है। बीन पहले बनाया गया है, तो निर्भरता इंजेक्शन दी जाती है। अगर आपको अपने कन्स्ट्रक्टर में इसकी ज़रूरत है, तो ऐसा करें

@Autowired
public NetworkUsageService(NetworkUsageMapper mapper){
// do stuff
}
0
जोड़ा
धन्यवाद, सिर्फ स्पष्टीकरण के लिए - अगर मैं आपके कोड में जैसा ऑटोवॉयर निर्भरता मानता हूं और छोड़ देता हूं, तो क्या इसका मतलब यह है कि नेटवर्क यूजमैपर का 2 उदाहरण होंगे?
जोड़ा लेखक Wolf, स्रोत
मुझे वास्तव में यकीन नहीं है कि स्प्रिंग कैसे संभालती है। अस्पष्टता को खत्म करने के लिए मैं आपकी मौजूदा एनोटेशन हटा दूंगा। उस ने कहा, आप अपने NetworkUsageMapper कक्षा को @Singleton एनोटेशन के साथ एनोटेट कर सकते हैं और यह गारंटी देगा कि केवल एक उदाहरण वसंत द्वारा बनाया गया है और सभी निर्भरता इंजेक्शन के लिए उपयोग किया जाता है। अन्यथा, एक से अधिक वर्ग निर्भरता का उपयोग करते हैं तो कई उदाहरण बनाए जा सकते हैं।
जोड़ा लेखक Chris Thompson, स्रोत

यदि आप अपने वसंत विन्यास के साथ अपवाद स्टैक-ट्रेस जोड़ सकते हैं जो अधिक सटीक उत्तर देने में मदद करेगा। मुझे लगता है कि ऐसा इसलिए है क्योंकि आपके पास NetworkUsageMapper क्लास या इसके गायब होने के लिए एक से अधिक बीन उदाहरण हो सकते हैं।

  1. If its missing just add one :). To avoid exception you can use required attribute:

    @Autowired(required=false) private NetworkUsageMapper networkUsageMapper;

  2. If more than one फिर you need to use qualifier for example :

फिर

@Autowired
@Qualifier("networkUsageMapper1")
private NetworkUsageMapper networkUsageMapper;

उम्मीद है कि यह मदद करता है: मक्का

0
जोड़ा

कन्स्ट्रक्टर में बहुत से काम करने के बजाय (और संभावित रूप से समस्याएं पेश करते हैं क्योंकि एप्लिकेशन डेटाबेस पर जाने की कोशिश करता है जब इसे पूरी तरह से प्रारंभ नहीं किया जाता है) यह संभवतः एक प्रारंभिक तरीके से प्रारंभ करने के लिए बेहतर है और इसे @PostConstruct के साथ एनोटेट करना बेहतर है। इस तरह से आप निश्चित रूप से जानते हैं कि नेटवर्कसर्मैपर कहने से पहले आपका एप्लिकेशन पूरी तरह से वायर्ड है।

0
जोड़ा
उत्तर के लिए धन्यवाद, यह मुझे कुछ चाहिए जैसा लगता है, मैं कोशिश करूँगा, लेकिन क्या आप सुनिश्चित कर सकते हैं कि @PostConstruct विधियों को लागू करने से पहले निर्भरताएं स्वचालित हो गई हैं?
जोड़ा लेखक Wolf, स्रोत
हां, यह अनुबंध का हिस्सा है। @PostConstruct के साथ एनोटेटेड विधि को सभी बीन्स (ऑटो) वायर्ड के बाद बुलाया जाता है।
जोड़ा लेखक Janoz, स्रोत