依赖注入和新对象创建

时间:2017-11-13 10:57:30

标签: oop dependency-injection inversion-of-control cdi ioc-container

我是依赖注入的新手。我似乎对它有了很好的理解,但我对一件事情感到有些困惑。假设我有一个bean:

@Bean
HttpClient {
  public void void POST(String url, Object payload) {
    .......
  }
}

并且有一个使用该bean的类:

Message {

 public void send() {
  httpClient.POST(this);
 }
}

显然我应该将 HttpCLient 注入消息。但是.... 消息还有一个带有参数的构造函数:

Message {

 private final String text;

 public Message(String text) {
   this.text = text;
 }

 public void send() {
  httpClient.POST(this);
 }
}

它将以这种方式使用:

SomeClient {

  if(....) {
    new Message("Case 1 text").send();
  } else {
      new Message("Case 2 text").send();
   }
}

因此消息是一个不可变对象,每个请求都使用新构造函数的参数,同时需要注入重量级的 HttpClient

也许这个例子不太正确,但我相信你遇到过许多类似的问题。

所以问题是:如果我必须手动实例化对象但是它们需要依赖注入,我该怎么办?

1 个答案:

答案 0 :(得分:1)

传播依赖关系通常通过 Factories 解决。您没有直接实例化Message,而是使用Factory来执行此操作,如下所示:

messageFactory.createMessage("Text").send();

消息工厂为:

public interface MessageFactory {
    Message createMessage(String text);
}

然后,对HTTP客户端的依赖是在实际工厂中:

public final class HttpClientBasedMessageFactory {
    private final HttpClient httpClient;
    ...
    @Override
    public Message createMessage(String text) {
        return new Message(httpClient, text);
    }
}

现在没有任何依赖注入“框架”,但它可以调整为支持你正在使用的任何东西。