Java 如何使用guice在控制器中注入我的服务类?
我想将DI特性添加到一个旧的代码库中,该代码库在控制器层中使用简单的服务实例 我尝试在控制器类中的Java 如何使用guice在控制器中注入我的服务类?,java,dependency-injection,guice,Java,Dependency Injection,Guice,我想将DI特性添加到一个旧的代码库中,该代码库在控制器层中使用简单的服务实例 我尝试在控制器类中的serviceInterface字段之前使用@Inject。并使用@ImplementedBy(ServiceInterfaceImpl)注释我的ServiceInterface 我的代码如下所示: 控制器类 public class MyController { @Inject ServiceInterface serviceInterface; InitContext(
serviceInterface
字段之前使用@Inject
。并使用@ImplementedBy(ServiceInterfaceImpl)
注释我的ServiceInterface
我的代码如下所示:
控制器类
public class MyController {
@Inject
ServiceInterface serviceInterface;
InitContext(..){
// somecode
Toto toto = serviceInterface.getToto(); //I get an NPE here
// other code
}
}
服务接口代码:
@ImplementedBy(ServiceInterfaceImpl.class)
public interface ServiceInterface {
Toto getToto();
}
ServiceInterfaceImpl代码:
@Singleton
public class ServiceInterfaceImpl implements ConventionServices {
Toto getToto(){
//somecode
}
}
我希望我的服务将被实例化,但我得到一个NPE,它表明我遗漏了什么,我尝试在我的服务构造函数之前添加@Provides
,但没有任何更改。您应该在构造函数中注入ServiceInterface
,而不是作为字段注入
您的问题是您有空值,因为字段注入发生在构造函数注入之后。因此,将注入移动到构造函数,而不是字段注入:
public class MyController {
private final ServiceInterface serviceInterface;
@Inject MyController(ServiceInterface serviceInterface) {
this.serviceInterface = serviceInterface;
Toto toto = serviceInterface.getToto();
}
...
}
您应该在构造函数中注入ServiceInterface
,而不是作为字段注入
您的问题是您有空值,因为字段注入发生在构造函数注入之后。因此,将注入移动到构造函数,而不是字段注入:
public class MyController {
private final ServiceInterface serviceInterface;
@Inject MyController(ServiceInterface serviceInterface) {
this.serviceInterface = serviceInterface;
Toto toto = serviceInterface.getToto();
}
...
}
什么负责实例化控制器类?如果您是通过调用
new
自己完成的,那么它将不在CDI上下文中,并且不会自动注入任何依赖项。我猜您可能没有手动实例化它,但是,皮带和支架…您如何构造控制器?使用您应该使用的注入器或通过调用构造函数直接调用注入器?我使用构造函数(InitContext)构造控制器字段(如果有帮助,这是一个jsp类型关闭应用程序,因此基本上我的控制器链接到一个jsp页面),所以您直接在代码的某个地方调用new MyController()
?如果是这样,这就是为什么依赖项为null
,如果手动构造,则需要手动注入。否则,您需要依赖一些支持CDI的框架来为您处理实例化。因此,我选择Guice作为将DI引入此应用程序的方法可能是错误的。我认为@Inject
和@implemeedby
足以实例化我的服务对象。实例化控制器类的责任是什么?如果您是通过调用new
自己完成的,那么它将不在CDI上下文中,并且不会自动注入任何依赖项。我猜您可能没有手动实例化它,但是,皮带和支架…您如何构造控制器?使用您应该使用的注入器或通过调用构造函数直接调用注入器?我使用构造函数(InitContext)构造控制器字段(如果有帮助,这是一个jsp类型关闭应用程序,因此基本上我的控制器链接到一个jsp页面),所以您直接在代码的某个地方调用new MyController()
?如果是这样,这就是为什么依赖项为null
,如果手动构造,则需要手动注入。否则,您需要依赖一些支持CDI的框架来为您处理实例化。因此,我选择Guice作为将DI引入此应用程序的方法可能是错误的。我认为@Inject
和@implemeedby
足以对我的服务对象进行实例化。