我是依赖注入的新手。我似乎对它有了很好的理解,但我对一件事情感到有些困惑。假设我有一个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 。
也许这个例子不太正确,但我相信你遇到过许多类似的问题。
所以问题是:如果我必须手动实例化对象但是它们需要依赖注入,我该怎么办?
答案 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);
}
}
现在没有任何依赖注入“框架”,但它可以调整为支持你正在使用的任何东西。