我有一个用例,我使用的是基于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方法中的setter设置成员,但@inject成员为null,我得到countEvent和durationEvent的NullPointerException。
我的代码使用以下提供程序类来创建要与PTRS类绑定的对象。
@Provides
PTRS new PTRS(Client client){
PTRS ptrs = new PTRS();
ptrs.setGeoServiceClient(client);
return ptrs;
}
如何在不更改外部类的情况下注入这两个依赖项?
答案 0 :(得分:2)
注入MembersInjector
在Guice不创建的对象上填充@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实例。但是,这里的最佳做法是尽可能地注入界面,以便阅读清晰,易于嘲笑。