2 回答
TA贡献1891条经验 获得超3个赞
基本上你的问题是你试图将一个接口绑定到一个单例而不提供任何实现。然后在你的“答案”中,你实际上做得更好:你提供了一个带有实现的接口,然后你说你的实现是一个单例。但是,您实际上并没有使 成为UserDAO一个有效的单例,因为您为每个UserService.
请尝试以下操作:
ApplicationModule.java
public class ApplicationModule extends AbstractModule {
@Override protected void configure() {
bind(UserDAO.class) // Define UserDAO
.to(UserDAOImpl.class) // as implemented by UserDAOImpl
.in(Singleton.class); // and make it a singleton.
}
}
UserService.java
public class UserService {
private final UserDAO userDAO;
@Inject UserService(UserDAO userDAO) { // Actually inject your UserDAO!!
this.userDAO = userDAO;
}
}
Main.java
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new ApplicationModule());
UserService userService = injector.getInstance(UserService.class);
}
}
TA贡献1786条经验 获得超13个赞
我发现了一些东西...
如果我将 ApplicationModule 更改为:
public class ApplicationModule extends AbstractModule {
@Override
protected void configure() {
bind(UserDAO.class).to(UserDAOImpl.class);
bind(UserDAOImpl.class).in(Singleton.class);
}
}
这不能解决问题......我的 UserDAO 仍然没有被注入,但我可以用Guice.createInjector(new ApplicationModule()). 所以在 UserService 构造函数上,我可以做这样的事情:
public UserService() {
Injector injector = Guice.createInjector(new ApplicationModule());
injector.injectMembers(this);
}
添加回答
举报