Google Guice,如何在注入课程之前和之后注入资源

时间:2012-07-20 13:02:40

标签: java dependency-injection guice

我有以下情况:

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。

1 个答案:

答案 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);
    }
}
相关问题