Google Guice Inject会员无法使用

时间:2018-08-17 16:30:36

标签: java dependency-injection guice

我正在使用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())

有人知道发生了什么事吗?我想念的是什么?

2 个答案:

答案 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);
}