将Dagger组件存储在静态字段中

时间:2016-01-29 12:25:39

标签: java android dependency-injection dagger

我是Dagger2中的新手,大部分时间我都看到人们在扩展的应用程序类中创建了 AppComponent 。因此,只要您需要AppComponent,您就可以通过Application类请求它。

public class App extends Application {

private AppComponent mAppComponent;

@Override
public void onCreate() {
    super.onCreate(); 
    mAppComponent = DaggerAppComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();
}

public AppComponent getAppComponent() {
    return mAppComponent;
}

@VisibleForTesting
public void setAppComponent(AppComponent appComponent) {
    mAppComponent = appComponent;
}
}

我也看到有人使用 ComponentFactory

public class ComponentFactory {

public static final AppComponent getComponent(Application context) {
        return DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(context))
                .build();
    }

将AppComponent存储在Application类中的优缺点是什么?

每次我们需要它时,最好通过工厂创建吗?

如果我们在静态字段中保留Component而不是每次构建它,会不会有任何问题?

1 个答案:

答案 0 :(得分:2)

每次构建组件(取决于组件的大小)都是浪费的,但更重要的是,如果每次重新创建组件,则使用的任何@Scope注释都不会共享同一个实例。将您的组件存储在Application类中是一种常见方法,因为它提供了一个规范的位置来检索整个应用中的组件。当您考虑应用程序的生命周期(尤其是测试时)时,static字段可能会很棘手,并且通常被认为是反模式。通过将组件保留在应用程序类中可以获得许多相同的好处,因为只要您的应用程序处于活动状态,您就可以正确地假设Android框架只会创建一个Application实例。如果只有一个Application并且它只创建一个组件,则可以确保单一性,并且可以正确控制组件的可见性。