Dagger: нельзя аннотировать сторонние классы?

Я новичок в Даггере. В его документе сказано

Сторонние классы не могут быть аннотированы

Но в этом примере UpcomingMoviesMVP он внедряет шину OTTO в MainActivity:

public class MainActivity extends BaseActivity {

@Inject
protected Bus bus;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onResume() {
    super.onResume();
    registerBus();
}

@Override
protected void onPause() {
    super.onPause();
    unRegisterBus();
}

private void registerBus() {
    bus.register(this);
}

private void unRegisterBus() {
    bus.unregister(this);
}

@Subscribe
public void onItemSelectedEvent(MovieSelectedEvent event) {
    launchMovieDetailsActivity(event.getMovie());
}

Поэтому я думаю, что Dagger должен вызывать конструктор шины по умолчанию (конечно, в конструкторе шины нет аннотации ввода). Но это кажется конфликтующим с «Сторонние классы не могут быть аннотированы»?


person mianlaoshu    schedule 27.03.2015    source источник
comment
Вы получаете ошибку, когда делаете это?   -  person nhaarman    schedule 27.03.2015
comment
Нет, он может скомпилироваться и успешно работать в студии Android. Отлично работает.....   -  person mianlaoshu    schedule 27.03.2015
comment
Я думаю, что имеется в виду, что вы не можете аннотировать конструктор стороннего класса (поскольку вы не можете изменить исходный код).   -  person nhaarman    schedule 27.03.2015


Ответы (1)


Я думаю, что Dagger должен вызывать конструктор Bus по умолчанию.

А если конструкторов несколько? Что выбирает?

Dagger не будет случайным образом создавать экземпляры класса. Вы должны сказать ему, что использовать или создать его самостоятельно.

В этом случае Bus может быть аннотирован конструктором @Inject. Это позволило бы Кинжалу ввести его без всего остального. Однако у Отто этого нет, поэтому он должен исходить откуда-то еще.

Другой способ — написать метод провайдера.

@Provides @Singleton Bus provideBus() {
  return new Bus();
}

Этот метод (написанный в Dagger @Module) предоставит Dagger средство получения экземпляра Bus для внедрения. И поскольку он помечен @Singleton, Dagger будет вызывать этот метод только один раз и повторно использовать экземпляр снова и снова каждый раз, когда он запрашивается.

person Jake Wharton    schedule 27.03.2015