Dagger组件依赖含义

时间:2017-03-23 13:28:38

标签: java android dependency-injection dagger-2 dagger

我正在尝试使用Dagger 2,而我只是在测试一下以理解框架。

我有一个ApplicationComponent需要是整个应用程序的单例,所以我这样定义:

@Component(modules = {ApplicationModule.class})
@Singleton
public interface ApplicationComponent {
    Context provideContext();
}

使用模块:

@Module
public class ApplicationModule {

    private Application appContext;

    public ApplicationModule(Application appContext) {
        this.appContext = appContext;
    }

    @Provides
    @Singleton
    public Context provideContext() {
        return appContext;
    }
}

现在我还想要一个只要应用程序存在就需要生效的NetworkComponent。 该网络组件需要依赖ApplicationComponent。 所以我的网络组件如下:

@Component(dependencies = {ApplicationComponent.class}, modules = {NetworkModule.class})
@PerApp
public interface NetworkComponent extends ApplicationComponent {
    @Named(DaggerConstants.DEFAULT_RETROFIT)
    Retrofit provideDefault();

    @Named(DaggerConstants.OTHER_RETROFIT)
    Retrofit provideOther();

    void inject(MainActivity activity);
}

模块:

@Module
public class NetworkModule {

    @Named(DaggerConstants.DEFAULT_RETROFIT)
    @PerApp
    @Provides
    Retrofit provideDefaultRetrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.someurl.com/")
                .build();

        return retrofit;
    }

    @Named(DaggerConstants.OTHER_RETROFIT)
    @PerApp
    @Provides
    Retrofit provideOtherRetrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.someotherurl.com/")
                .build();

        return retrofit;
    }

    @PerApp
    @Provides
    SharedPreferences networkPreferences(Context context) {
        return context.getSharedPreferences("network", Context.MODE_PRIVATE);
    }
}

我有一些问题:

1)我将这两个组件存储在Android中的Application中。 但对我而言,我存储AppComponent和NetworkComponent似乎很奇怪。 我的ApplicationComponent应该提供NetworkComponent不是更好吗?

2)注释@PerApp和东西是否意味着什么,或者Dagger只是看到有一个具有@PerApp注释的实时对象,如果没有那么它会删除它?我不清楚这一点。

3)用例如@Singleton标记模块是否有用,因为它是可能的但我在任何例子中都看不到。

1 个答案:

答案 0 :(得分:4)

  

我将这两个组件存储在Android中的Application中。但对我而言,我存储AppComponent和NetworkComponent似乎很奇怪。我的ApplicationComponent应该提供NetworkComponent不是更好吗?

您缺少组件的概念。组件背后的想法是拥有对象,它们的生命周期彼此不同。 例如:

  • 对象A应该是app singleton。每当你需要这个对象时,它就是完全相同的对象
  • 对象B应该是活动单例。每次您的活动被销毁并创建时,都会创建一个新对象。
  • 对象C应该是片段单例。每次将片段连接并分离到活动时,都会创建一个新对象。

    因此,您指定希望ComponentC具有ComponentB的依赖关系,ComponentA依赖于@PerApp(假设每个提供相应的命名依赖关系。)

  

注释ComponentB和东西是否意味着什么,或者Dagger只是看到有一个具有@PerApp注释的实时对象,如果没有,那么它会删除它?我不清楚这一点。

自定义范围对于您负责的一生中的对象非常有用。即,如果您使用自定义范围声明了一个组件,则您负责清除该组件,此后,下次从组件中询问该依赖关系时,将为您创建一个新对象。

在上面的示例中,您必须在活动被销毁后立即对B进行清空,否则下次要求时会为您提供相同的text?text text?text text**text** text*text (text) text *text* text? 对象。< / p>

  

使用例如@Singleton标记模块是否有用,因为它是可能的但我在任何示例中都没有看到。

在提供依赖关系方面没有任何区别。但也许它会帮助你记住托管组件的范围。