Внедрить класс точки входа в GWT с помощью GIN

Я пытался сделать что-то вроде этого:

@Singleton
public class AAA implements EntryPoint, HistoryListener
{

private BBB bbb;
private CCC ccc;
private DDD ddd;
private EEE eee;

@Inject
public AAA(BBB bbb, CCC ccc, DDD ddd, EEE eee)
{
  this.bbb = bbb;
  this.ccc = ccc;
  this.ddd = ddd;
  this.eee = ee;
}
.........
}

Результат нулевой для всех экземпляров. Я ожидал, что этот способ сработает...

Я знаю, что мог бы сделать что-то вроде этого, например

private final MyGinjector injector = GWT.create(MyGinjector.class);

injector.getAAA()
and so on..

Почему первый способ, который я пробовал, не работает для меня? Какие-либо предложения?

Спасибо


person adgfs    schedule 27.06.2011    source источник


Ответы (2)


Вы можете использовать функцию injectMembers Guice, которая в GIN выполняется путем объявления метода в вашем Ginjector с одним аргументом.

@GinModules(...)
interface MyGinjector extends Ginjector {

   public void injectEntryPoint(AAA entryPoint);

   ...
}

public class AAA implements EntryPoint {
   @Inject private BBB bbb; // field injection works
   private CCC ccc;

   @Inject void setCcc(CCC ccc) { this.ccc = ccc; } // and of course method injection

   public onModuleLoad() {
      MyGinjector injector = GWT.create(MyGinjector.class);
      injector.injectEntryPoint(this);
      ...
   }
}

Кстати, вам не нужно аннотировать EntryPoint с помощью @Singleton: если только вы не внедрите его в другой класс (и вам придется прибегнуть к хакам, чтобы связать его с экземпляром, созданным GWT, и не создавать GIN самостоятельно), у вас будет только один экземпляр EntryPoint в вашем приложении.

person Thomas Broyer    schedule 28.06.2011

GIN зависит от GWT, поэтому GIN знает о GWT, но GWT не знает о GIN.

Таким образом, инициализация ваших классов через GWT.create(AAA.class) будет инициализировать AAA обычным способом GWT, без GIN, что означает отсутствие внедрения зависимостей.

Чтобы иметь инъекцию зависимостей, вам нужно инициализировать свои классы через GIN, используя инжектор (как вы отметили выше).

person Peter Knego    schedule 27.06.2011