getterによる依存注入


依存注入はインタフェース向けプログラミングの前提であり,オブジェクトの使用とオブジェクトの作成を分離する.ユーザはインタフェースを知るだけで,具体的な実装がどのクラスであるかに関心を持つ必要はない.
例:

public interface Job {
  public boolean doJob();
}

public class SweepJob {

  private int garbage = 10;

  public boolean doJbo() {
    System.out.println("  ");
    garbage--;
    return garbage < 3;
  }
}

public class Worker {

  private Job job;

  public void work() throws Exception {
    while (!job.doJob()) {
      System.out.println("   ,  ");
      Thread.sleep(100);
    }
  }
  
}

WorkerはSweepJobに依存せずにjobに依存しますが、WorkerはSweepJobオブジェクトを取得する必要があります.この場合、外部のコンテナが必要になります.Workerも対応する修正をして注入を受信します.
1.構造注入

public class Worker {

  private Job job;

  public Worker(Job job) {
    this.job = job;
  }
  ...
}

public class AppContext {
  
  private SweepJob job;
  private Worker worker;

  public void createBeans() {
    job = new SweepJob();
    worker = new Worker(job);
  }
}

2.setter注入

public class Worker {
  
  private Job job;

  public void setJob(Job job) {
    this.job = job;
  }
  ...
}

public class AppContext {
  
  private SweepJob job;
  private Worker worker;

  public void createBeans() {
    job = new SweepJob();
    worker = new Worker();
    worker.setJob(job);
  }
}

3.getter注入は、このログを書く目的でもあり、今日webxフレームワークを見て知ったのは、新しい意味があるような気がします.

public abstruct class Worker {
  
  public abstruct Job getJob();
  
  public void work() throws Exception {
    while (!getJob().doJob()) {
      System.out.println("   ,  ");
      Thread.sleep(100);
    }
  }
}

public class AppContext {
  
  private SweepJob job;
  private Worker worker;

  public void createBeans() {
    job = new SweepJob();
    worker = new Worker() {
      public Job getJob() {
        return job;
      }
    };
  }
}