我有以下情况:
Class ServiceCaller:
public class ServiceCaller{
private Service service;
public void initialize(List<String> params){
//get the params from list and set to String objects
service = new Service(param1,param2);
}
}
班级服务:
public class Service{
SomeClass classe;
public Service(String param1,String param2){
//call methods to do stuffs with params
classe = new SomeClass();
}
}
我的应用程序有一个框架,它读取.properties并调用ServiceCaller类,然后在构造之后初始化并填充ServiceCaller中的参数。 Service类,只需使用参数,并实例化SomeClass类。
我正试图将所有这些传递给Google Guice,我的课程也是如此:
班级服务来电:
public class ServiceCaller{
private final Service service;
@Inject
public ServiceCaller(Service service){
this.service = service;
}
public initialize(List<String> params){
//set params to objects...
}
}
和班级服务:
public class Service{
private final SomeClass classe;
@Inject
public Service(SomeClass classe, String param1,String param2){
//call methods to do stuffs with params
this.classe = classe;
}
}
这是我的疑问:我怎么能做到这一点?
1 - 在ServiceCaller中,注入的construtor在initMethod之前调用,这样他就没有Params了。我认为在Service类中生成一个nullPointer。我怎么能收到String参数?
2 - 如何在ServiceCaller类中注入服务类?他需要调用init,使用参数挂载Service类,并且只在此时将Service(已经使用params)注入ServiceCaller。
答案 0 :(得分:1)
配置ServiceCaller
真的是Service
的工作吗?如果是这样,那么这种情况并不适合依赖注入。只需像现在一样使用Service
创建new
。
但是创建ServiceCaller
可能不是Service
的真正工作。相反,您应该将参数直接注入Service
进行配置,然后将已配置的Service
注入ServiceCaller
。
现在,如果问题是参数来自ServiceCaller
,但SomeClass
需要注入,那么ServiceCaller
和Guice都无法完成工作他们自己的。我建议你拆分构造:创建一个ServiceFactory
,可以注入SomeClass
,然后注入ServiceCaller
,然后提供一个获取参数的工厂方法。类似的东西:
ServiceCaller {
private final ServiceFactory serviceFactory;
private Service service;
@Inject
public ServiceCaller(ServiceFactory serviceFactory) {
this.serviceFactory = serviceFactory;
}
public void initialize(List<String> params) {
service = serviceFactory.create(params.get(0), params.get(1));
}
}
class Service {
private final SomeClass classe;
public Service(SomeClass classe, String param1, String param2) {
//call methods to do stuffs with params
this.classe = classe;
}
}
class ServiceFactory {
private final SomeClass classe;
@Inject
public ServiceFactory(SomeClass classe) {
this.classe = classe;
}
public Service create(String param1, String param2) {
return new Service(classe, param1, param2);
}
}