Dagger:第三方类不能注解?

Dagger: Third-party classes can't be annotated?

我是 Dagger 的新手。在其 doc 中,表示

Third-party classes can't be annotated

但是在这个 UpcomingMoviesMVP 示例中,它在 MainActivity 中注入了 OTTO 总线:

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应该调用Bus的默认构造函数(当然Bus构造函数中没有inject注解)。但是好像和"Third-party classes can't be annotated"冲突了?

I think Dagger should invoke the default constructor of the Bus

如果有多个构造器怎么办?它选择哪个?

Dagger 不会随机创建 class 个实例。你必须告诉它使用哪个或自己创建它。

在这种情况下,Bus 可以使用 @Inject 构造函数进行注释。这将使 Dagger 无需其他任何东西即可注入它。然而,奥托没有这个,所以它必须来自其他地方。

另一种方法是编写提供程序方法。

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

此方法(用 Dagger @Module 编写)将为 Dagger 提供一种获取 Bus 实例进行注入的方法。由于它被注释为 @Singleton,Dagger 只会调用此方法一次,并在每次请求时一遍又一遍地重复使用该实例。