我正在使用GoogleGuice作为DI创建一个新项目。
所以我创建了我的DAO的接口:
<script>
(function(){
document.querySelector('body').addEventListener('scriptsLoaded', function() {
// .. do your thing here
});
})();
</script>
及其实现:
public interface UserDAO extends DAO<User> {
// Some CRUD methods
}
这是我的ApplicationModule类:
public class UserDAOImpl implements UserDAO {
// CRUD Methods implementation
}
在我的UserService上,我尝试这样做:
public class ApplicationModule extends AbstractModule {
@Override
protected void configure() {
// Tried swap the order without results
bind(UserDAO.class).in(Singleton.class);
bind(UserDAO.class).to(UserDAOImpl.class);
}
}
但是我的岛一直都是空的。而且,当我在UserService构造函数上调用@Inject
private UserDAO dao;
时,得到了以下堆栈跟踪:
Guice.createInjector(new ApplicationModule())
有人知道发生了什么事吗?我想念的是什么?
答案 0 :(得分:1)
基本上,您的问题是您试图将接口绑定到单例而不提供任何实现。然后,在“答案”中,您实际上会做得更好:为接口提供一个实现,然后说您的实现是单例。但是随后,您实际上无法使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);
}
}
答案 1 :(得分:0)
我发现了一些东西...
如果我将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);
}