2011-06-13 14 views
65

के कन्स्ट्रक्टर में संदर्भित होने पर शून्य है, नीचे दिखाया गया कोड कोड का एक स्निपेट है जहां मैं अपने एप्लिकेशनप्रॉपर्टीज बीन का प्रयास करता हूं और संदर्भ देता हूं। जब मैं इसे कन्स्ट्रक्टर से संदर्भित करता हूं तो यह शून्य है, लेकिन जब किसी अन्य विधि से संदर्भित किया जाता है तो यह ठीक है। अब तक मुझे अन्य कक्षाओं में इस स्वायत्त बीन का उपयोग करने में कोई समस्या नहीं है। लेकिन यह पहली बार है जब मैंने इसे किसी अन्य वर्ग के निर्माता में उपयोग करने का प्रयास किया है।@Autowired बीन एक और बीन

आवेदन के नीचे कोड स्निपेट में कन्स्ट्रक्टर से बुलाए जाने पर प्रॉपर्टीज शून्य है लेकिन कन्वर्ट विधि में संदर्भित होने पर यह नहीं है। क्या मुझे याद आ रही

@Component 
public class DocumentManager implements IDocumentManager { 

    private Log logger = LogFactory.getLog(this.getClass()); 
    private OfficeManager officeManager = null; 
    private ConverterService converterService = null; 

    @Autowired 
    private IApplicationProperties applicationProperties; 


    // If I try and use the Autowired applicationProperties bean in the constructor 
    // it is null ? 

    public DocumentManager() { 
    startOOServer(); 
    } 

    private void startOOServer() { 
    if (applicationProperties != null) { 
     if (applicationProperties.getStartOOServer()) { 
     try { 
      if (this.officeManager == null) { 
      this.officeManager = new DefaultOfficeManagerConfiguration() 
       .buildOfficeManager(); 
      this.officeManager.start(); 
      this.converterService = new ConverterService(this.officeManager); 
      } 
     } catch (Throwable e){ 
      logger.error(e); 
     } 
     } 
    } 
    } 

    public byte[] convert(byte[] inputData, String sourceExtension, String targetExtension) { 
    byte[] result = null; 

    startOOServer(); 
    ... 

नीचे ApplicationProperties से रों टुकड़ा है ...

@Component 
public class ApplicationProperties implements IApplicationProperties { 

    /* Use the appProperties bean defined in WEB-INF/applicationContext.xml 
    * which in turn uses resources/server.properties 
    */ 
    @Resource(name="appProperties") 
    private Properties appProperties; 

    public Boolean getStartOOServer() { 
    String val = appProperties.getProperty("startOOServer", "false"); 
    if(val == null) return false; 
    val = val.trim(); 
    return val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes"); 
    } 
+0

क्या हम आपका एक्सएमएल देख सकते हैं? – Drahakar

उत्तर

129

Autowiring (टिब्बा टिप्पणी से लिंक) एक वस्तु के निर्माण के बाद होता है। इसलिए जब तक कि कन्स्ट्रक्टर पूरा नहीं हो जाता तब तक वे सेट नहीं किए जाएंगे।

यदि आपको कुछ प्रारंभिक कोड चलाने की आवश्यकता है, तो आपको कन्स्ट्रक्टर में कोड को एक विधि में खींचने में सक्षम होना चाहिए, और @PostConstruct के साथ उस विधि को एनोटेट करना चाहिए।

+3

जैसा कि यह दस्तावेज़ों में कहता है - http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html – Dunes

+0

लिंक के लिए धन्यवाद, मैं करूंगा आसान खोज के लिए इसे उत्तर में जोड़ें। –

+2

धन्यवाद, मुझे अभी तक महत्वपूर्ण बयान में आने के लिए नहीं आया था "फ़ील्ड को बीन के निर्माण के ठीक बाद इंजेक्शन दिया जाता है ..."। मैंने @PostConstruct एनोटेशन की कोशिश की है और यह वही है जो मुझे चाहिए था। – hairyone

28

निर्माण समय पर इंजेक्शन पर निर्भरता रखने के लिए आपको अपने कन्स्ट्रक्टर को @Autowired एनोएशन के साथ चिह्नित करने की आवश्यकता है।

@Autowired 
public DocumentManager(IApplicationProperties applicationProperties) { 
    this.applicationProperties = applicationProperties; 
    startOOServer(); 
} 
+0

मैंने कोशिश नहीं की है, लेकिन यह शानदार लग रहा है। – asgs

+1

दरअसल मुझे लगता है कि यह पसंदीदा जवाब होना चाहिए। कन्स्ट्रक्टर आधारित निर्भरता इंजेक्शन दृष्टिकोण अनिवार्य घटकों के लिए बहुत उपयुक्त है। इस दृष्टिकोण का उपयोग करके वसंत ढांचा घटकों पर चक्रीय निर्भरताओं का पता लगाने में भी सक्षम होगा (जैसा कि ए में निर्भर करता है बी, बी सी पर निर्भर करता है, सी ए पर निर्भर करता है)। सेटर्स या ऑटोवार्ड फ़ील्ड का उपयोग करके इंजेक्शन शैली आपके क्षेत्र में पूरी तरह से प्रारंभिक बीन्स इंजेक्ट करने में सक्षम नहीं है जिससे चीजें थोड़ा और गन्दा हो जाती हैं। – Seakayone

संबंधित मुद्दे