Google Guice桌面应用程序 - 如何使其工作?

时间:2012-01-16 16:33:40

标签: java guice inject

我在我的网络应用中使用了Guice没有问题,我想在桌面应用中使用它。我当然缺少一件事 - 某种方式告诉我的应用程序如何绑定所有内容并知道什么是什么。在Web应用程序中,我在Application类中声明了这一点,我应该如何在桌面应用程序中执行此操作?

以下是我正在使用的相关代码:

public class GuiceModule extends AbstractModule
{
   @Override
   protected void configure()
   {
   // Enable per-request-thread PersistenceManager injection.
   install(new PersistenceManagerFilter.GuiceModule());
   // Business object bindings go here.
   bind(ProjectQueries.class).to(JdoProjectQueries.class);
   bind(new TypeLiteral<Repository<Project>>() { }).to(JdoProjectRepository.class);
 }

我的主要课程:

@Inject
public Repository<Project> projectRepo;

public void createNewProject() {
   ...
   projectRepo.persist(newProject);
}

我当然正在使用projectRepo.persist(newProject);

那么,我还需要做些什么才能让它发挥作用?

编辑:

好的,那个部分现在正常工作,谢谢:)似乎我需要做更多的事情,但要让持久性工作那样。

我现在在这里接受NPE:

public void persist(T entity) 
{ 
pmProvider.get().makePersistent(entity); 
} 

get()在这里返回null

看起来像     install(new PersistenceManagerFilter.GuiceModule()); 是不足够的。我需要做什么? My Repository类以:

开头
public abstract class JdoRepository<T> implements Repository<T> { 
  private final Class<T> clazz; 
  private final Provider<PersistenceManager> pmProvider; 
  protected JdoRepository(Class<T> clazz, Provider<PersistenceManager> pmProvider)    {       this.clazz = clazz; this.pmProvider = pmProvider; 
} 

在我的PMF,我有:

public static class GuiceModule extends AbstractModule { 

  @Override protected void configure() { 
    bind(PersistenceManager.class).toProvider(new Provider<PersistenceManager>() {
      public PersistenceManager get() { 
         return PersistenceManagerFilter.pm.get(); 
         } 
      }); 
    } 
   }

3 个答案:

答案 0 :(得分:5)

使用main方法创建Bootstrap类。

将当前的静态主方法代码移动到非静态方法代码。例如Application#run

Bootstrap类中创建主要方法:

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new GuiceModule())
    Application app = injector.getInstance(Application.class);
    app.run();
}

运行Bootstrap课程。

答案 1 :(得分:3)

使用Guice注入器创建的任何对象都会将对象注入其属性和方法中。因此,一种方法是在createNewProject中创建一个注入器。

Injector injector = Guice.createInjector(new BeanModule(),.....
YourMainClass startClass = injector.getInstance(YourMainClass.class);
startClass.kickOfEveryThing();....

答案 2 :(得分:1)

您至少需要向注射器询问一个根对象。这个根对象将注入对象,这些对象将被注入对象等。该过程需要引导。

请参阅http://code.google.com/p/google-guice/wiki/GettingStarted

Injector injector = Guice.createInjector(new GuiceModule());
Main main = injector.getInstance(Main.class);