我有以下代码示例
public interface MyDao {
...
}
public class MyDaoImpl implements MyDao {
...
}
public class MyService {
@Inject
private MyDao myDao;
...
}
public class MyModule extends AbstractModule {
@Override
public void configure() {
bind(MyDao.class).to(MyDaoImpl.class).in(Singleton.class);
}
}
在上课时,我有
Injector injector = Guice.createInjector(new MyModule());
MyService myService = injector.getInstance(MyService.class);
MyService myService2 = injector.getInstance(MyService.class);
myService
和myService2
是不同的对象。
如果我在MyModule
中添加以下代码
@Provides
@Singleton
public MyService getMyService() {
return new MyService();
}
myService
和myService2
成为同一对象,但变量myDao
变为空。
如何在不更改MyService
的构造函数的情况下使myDao
单身并让变量MyService
自动注入?
答案 0 :(得分:2)
在您给出的示例中,您是通过简单地调用其构造函数而不是注入来生成MyService
的。
要解决您的问题,您可以将服务绑定到配置中,并通过调用getInstance
public class MyModule {
@Override
public void configure() {
bind(MyDao.class).to(MyDaoImpl.class).in(Singleton.class);
bind(MyService.class).in(Singleton.class);
}
}
请注意,如chrylis所述,在MyDao
类中更改MyService
对象的构造函数或添加设置器将是更好的解决方案。如果您不得不在不进行注入的情况下创建对象,甚至不得不更改注入框架,那将为您节省无数的时间。