【问题标题】:Google Guice, how to inject resources before, and after inject the classGoogle Guice,如何在注入类之前和之后注入资源
【发布时间】:2012-07-20 13:02:40
【问题描述】:

我有以下情况:

类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 中,注入的构造函数在 initMethod 之前被调用,这样他还没有参数。我认为这会在 Service 类中生成一个 nullPointer。如何接收字符串参数?

2 - 我如何在 ServiceCaller 类中注入服务类?他需要调用init,挂载带参数的Service类,此时才将Service(已经带参数)注入ServiceCaller。

【问题讨论】:

  • 谁定义了“参数”?它真的是一个运行时调用还是这些会话/应用程序范围的值(如 wsdl-url、jndi-name、...)?然后您可以通过模块配置这些值并将它们作为“命名”常量注入...

标签: java dependency-injection guice


【解决方案1】:

配置Service真的是ServiceCaller的工作吗?如果是这样,那么这种情况并不适合依赖注入。只需像现在一样使用new 创建Service

但创建Service 可能并不是真正的ServiceCaller 的工作。而是直接将参数注入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);
    }
}

【讨论】:

  • ServiceCaller真正的工作是创建Service,而Caller在其他情况下使用Service的实例。我实例化了它的属性(使用 new Service()),但现在我不知道如何在 Service 中注入“SomeClass”。
猜你喜欢
  • 2016-05-07
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2011-09-30
  • 1970-01-01
  • 2018-01-01
相关资源
最近更新 更多