GIN @Inject для переменной для Rpc Services - PullRequest
3 голосов
/ 20 февраля 2012

Я немного растерялся с использованием Inject для переменной.

У меня работает этот код:

private XXServiceAsync xxServiceAsync;

@Inject
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) {
    super(eventBus, mapper);

    this.xxServiceAsync = xxServiceAsync;
    initializeWidgets();
}

С помощью этого кода я могу вызывать свою службу RPC везде, где мне нужно в классе (при нажатии ...) Я хотел бы немного очистить код путем непосредственного введения в переменную; при этом:

@Inject
private XXServiceAsync xxServiceAsync;


protected IndexViewImpl(EventBus eventBus) {
    super(eventBus, mapper);
    initializeWidgets();
}

Это всегда поддерживает Службу в NULL. Я делаю что-то неправильно ? Магию GIN с сервисами rpc нужно делать иначе?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 20 февраля 2012

В этот момент он все еще равен нулю, потому что Gin (и Guice, и другие подобные структуры) не могут назначать поля, пока конструктор не завершит работу.

Подумайте, как бы это выглядело, если бы вы вручную подключали код (помните, что Gin / Guice немного обманет, чтобы назначить закрытые поля, вызовите невидимые методы):

MyObject obj = new MyObject();//initializeWidgets() runs, too early!
obj.xxServiceAsync = GWT.create(xxService.class);

Есливам нужно что-то в конструкторе, передать это в конструктор.Если вам это не нужно сразу (например, пока не вызывается asWidget ()), то поле или установщик, аннотированный @Inject, может быть полезен.

0 голосов
/ 21 февраля 2012

Если у вас есть инъекция на уровне поля, вы можете использовать пустой метод @Inject для выполнения инициализации после внедрения.Метод с введением без аргументов будет запущен после завершения внедрения полей в класс.

@Inject void initialize(){
  ...
  initializeWidgets()
}

Редактирование: Я ранее говорил, что он также запускался после внедрения метода, но тестирование показывает, что это не всегдадело.

...