如何使用guice将服务类注入控制器中?

时间:2019-08-23 13:42:56

标签: java dependency-injection guice

我想在旧代码库中添加DI功能,该代码库在控制器层使用简单的服务实例化。

我尝试在控制器类的@Inject字段之前使用serviceInterface。并用@ImplementedBy(ServiceInterfaceImpl)注释我的ServiceInterface。

我的代码如下所示: 控制器类

public class MyController {
    @Inject
    ServiceInterface serviceInterface;

    InitContext(..){
        // somecode
        Toto toto = serviceInterface.getToto(); //I get an NPE here
        // other code
    }
}

ServiceInterface代码:

@ImplementedBy(ServiceInterfaceImpl.class)
public interface ServiceInterface {
     Toto getToto();
}

ServiceInterfaceImpl代码:

@Singleton
public class ServiceInterfaceImpl implements ConventionServices {
     Toto getToto(){
          //somecode
     }
}

我希望我的服务将得到实例化,但是我得到了一个N​​PE,表明我错过了一些东西,我尝试在服务构造函数之前添加@Provides,但没有任何改变。

1 个答案:

答案 0 :(得分:2)

您应该在构造函数中注入ServiceInterface,而不是作为字段注入

您的问题是您有空值,因为在构造函数注入之后发生了字段注入。因此,将您的注入移动到构造函数,而不是字段注入:

public class MyController {
  private final ServiceInterface serviceInterface;
  @Inject MyController(ServiceInterface serviceInterface) {
    this.serviceInterface = serviceInterface;
    Toto toto = serviceInterface.getToto();
  }
  ...
}