【问题标题】:Google Guice desktop application - how to make it work?Google Guice 桌面应用程序 - 如何使其工作?
【发布时间】:2012-02-11 13:51:19
【问题描述】:

我在我的网络应用程序中使用 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

看起来像 安装(新的 PersistenceManagerFilter.GuiceModule()); 是不足够的。我需要做什么?我的存储库类开始于:

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(); 
         } 
      }); 
    } 
   }

【问题讨论】:

    标签: java guice inject


    【解决方案1】:

    您至少需要向注入器询问一个根对象。这个根对象会被注入对象,对象会被注入对象等等。进程需要bootstrap。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        使用 main 方法创建 Bootstrap 类。

        将您当前的静态主要方法代码移至非静态方法代码。例如Application#run

        Bootstrap类中创建main方法:

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

        运行Bootstrap 类。

        【讨论】:

        • 好的,解决了这个问题。看来我至少需要再发起一件事。我现在在这里得到 NPE: public void persist(T entity) { pmProvider.get().makePersistent(entity); }
        • 看起来像 install(new PersistenceManagerFilter.GuiceModule());是不足够的。我需要做什么?我的 Repository 类开始于: public abstract class JdoRepository implements Repository { private final Class clazz;私人最终提供者 pmProvider;受保护的 JdoRepository(Class clazz, Provider pmProvider) { this.clazz = clazz; this.pmProvider = pmProvider; }
        • 在我的 PMF 中,我有: public static class GuiceModule extends AbstractModule { @Override protected void configure() { bind(PersistenceManager.class).toProvider(new Provider() { public PersistenceManager get( ) { return PersistenceManagerFilter.pm.get(); } }); } }
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-05
        • 2021-06-20
        • 2015-01-24
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        相关资源
        最近更新 更多