依赖注入和新对象创建
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",但可以对其进行调整以支持您正在使用的任何内容。
我是依赖注入的新手。看来我对此很了解,但是我对一件事有点困惑。假设我有一个豆子:
@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",但可以对其进行调整以支持您正在使用的任何内容。