我有一个用例,其中我使用的是基于Spring的外部jar,而我的代码则基于Google guice。
我试图通过编写模块在我的依赖项jar的此类中注入依赖项。
外部类:
public class PTRS {
@Inject
private Event countEvent;
@Inject
private Event durationEvent;
private GeoServiceClient gClient;
public void setGeoServiceClient(GeoServiceClient client){this.gClient=client}
}
我可以在模块的@provides方法中使用setters设置成员,但是@inject成员具有null,并且为countEvent和durationEvent获取NullPointerException。
我的代码使用以下提供程序类来创建要与PTRS类绑定的对象。
@Provides
PTRS new PTRS(Client client){
PTRS ptrs = new PTRS();
ptrs.setGeoServiceClient(client);
return ptrs;
}
如何在不更改外部类的情况下注入这两个依赖项?
最佳答案
注入MembersInjector
在未创建的对象上填充@Inject
注释的字段(并调用@Inject
注释的方法)。 Guice在Wiki中将其称为"On-demand injection",尽管我在其他地方没有听说过该术语。
@Provides
PTRS newPTRS(Client client, MembersInjector<PTRS> ptrsInjector){
PTRS ptrs = new PTRS();
ptrsInjector.injectMembers(ptrs); // <-- inject members here
ptrs.setGeoServiceClient(client);
return ptrs;
}
如果您有权访问本身可注射的
Injector
,则可以直接调用injectMembers(Class)
或调用getMembersInjector
以获取所选类型的MembersInjector实例。但是,此处的最佳实践是注入尽可能窄的接口,以使阅读清晰且易于模拟。