依赖注入和新对象创建

Dependency Injection and new objects creation

我是依赖注入的新手。看来我对此很了解,但是我对一件事有点困惑。假设我有一个豆子:

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

并有一个 class 使用那个 bean:

Message {

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

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

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();
   }
}

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

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

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

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

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

消息工厂为:

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

然后在实际工厂中对HTTP Client的依赖:

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

现在没有任何依赖项注入"framework",但可以对其进行调整以支持您正在使用的任何内容。