@ বিনা শিমটি অন্য শিমের নির্মাতার সাথে উল্লেখ করা হলে শূন্য হয়


91

নীচে দেখানো হয়েছে কোডের একটি স্নিপেট যেখানে আমি চেষ্টা করেছি এবং আমার অ্যাপ্লিকেশন প্রোপার্টি বিনকে উল্লেখ করছি। আমি যখন এটি কনস্ট্রাক্টরের কাছ থেকে রেফারেন্স করব তখন এটি নাল, তবে অন্য পদ্ধতি থেকে রেফারেন্স দিলে এটি ঠিক আছে। এখন অবধি আমার অন্য শ্রেণিতে এই স্বায়িত শিমটি ব্যবহার করতে কোনও সমস্যা হয়নি। তবে এটি প্রথমবারের মতো অন্য শ্রেণির নির্মাতায় ব্যবহার করার চেষ্টা করেছি।

অ্যাপ্লিকেশনের নীচে কোড স্নিপেটে প্রপার্টিগুলি কনস্ট্রাক্টরের কাছ থেকে কল করার সময় বাতিল হয় তবে রূপান্তর পদ্ধতিতে রেফারেন্স এলে তা হয় না। আমি কী মিস করছি

@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();
    ...

নীচে অ্যাপ্লিকেশন প্রোপার্টি থেকে স্নিপেট দেওয়া আছে ...

@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");
  }

উত্তর:


182

প্রমাণীকরণ ( ডিউন মন্তব্য থেকে লিঙ্ক) একটি বস্তু নির্মাণের পরে ঘটে। সুতরাং কন্সট্রাক্টর সম্পূর্ণ হওয়ার পরে এগুলি সেট করা হবে না।

আপনার যদি কিছু সূচনা কোড চালানোর দরকার হয় তবে আপনার কনস্ট্রাক্টরের কোডটি কোনও পদ্ধতিতে টানতে সক্ষম হওয়া উচিত এবং সেই পদ্ধতিটি দিয়ে টীকাতে হবে @PostConstruct


4
যেমনটি ডক্সে
ডুনস

লিঙ্কটির জন্য ধন্যবাদ, আমি এটি সহজ অনুসন্ধানের জন্য উত্তরে যুক্ত করব।
নিকোলাস.হসচাইল্ড

4
আপনাকে ধন্যবাদ, আমি এখনও "সিম তৈরির পরে ক্ষেত্রগুলি ইনজেকশনে নিচ্ছি ..." জরুরী বিবৃতিটি পেরেছিলাম। আমি @ পোষ্টকনস্ট্রাক্ট টীকাটি চেষ্টা করেছি এবং এটি আমার প্রয়োজন ঠিক তাই।
হেয়ারওয়োন

এছাড়াও @PostConstruct সম্পর্কে একটি পোস্টের লিঙ্ক চমৎকার হবে static.springsource.org/spring/docs/3.0.0.M3/reference/html/...
Timofey

@ টিম ধন্যবাদ! আমি উত্তর লিঙ্কটি স্প্রিং ৩.২ সংস্করণে আপডেট করেছি এবং আমি আপনার লিঙ্কের একটি স্প্রিং ৩.২ সংস্করণও যুক্ত করেছি।
নিকোলাস.হসচাইল্ড

44

নির্মাণের সময় নির্ভরতা ইনজেকশনের জন্য আপনার @Autowiredকনস্ট্রাক্টরকে এর মতো বিরক্তির সাথে চিহ্নিত করা দরকার ।

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

4
আসলে আমি মনে করি এটি পছন্দসই উত্তর হওয়া উচিত। কনস্ট্রাক্টর ভিত্তিক নির্ভরতা ইনজেকশন পদ্ধতির বাধ্যতামূলক উপাদানগুলির জন্য খুব ভাল suited এই পদ্ধতির ব্যবহার করে বসন্তের কাঠামো উপাদানগুলির উপর চক্রীয় নির্ভরতাও সনাক্ত করতে সক্ষম হবে (এ হিসাবে বি এর উপর নির্ভর করে, বি সি এর উপর নির্ভরশীল, সি এ এর ​​উপর নির্ভরশীল)। ইনজেকশন শৈলী সেটার বা স্বাবলম্বিত ক্ষেত্রগুলি ব্যবহার করে আপনার ক্ষেত্রের মধ্যে পুরোপুরি আরম্ভ না করা মটরশুটিগুলি ইনজেক্ট করতে সক্ষম জিনিসগুলি আরও কিছুটা অগোছালো করে তোলে।
Seakayone
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.