Dagger2依赖关系分析
对应的PerActivity.java注解代码 @Scope @Retention(RetentionPolicy.RUNTIME) public @interface PerActivity { } 对应的Component文件: // AppComponent.java文件 @Singleton @Component(modules = AppModule.class) public interface AppComponent { public Activity getActivity(); void inject(App app); void inject(BaseActivity baseActivity); } // ActivityComponent.java文件 @PerActivity @Component(dependencies = AppComponent.class,modules = ActivityModule.class) public interface ActivityComponent { public Activity getActivity(); }
// AppModule.java文件 @Module public class AppModule { private final Context mContext; public AppModule(Context context) { this.mContext = context; } @Provides @Singleton public Context provideAppContext() { return mContext.getApplicationContext(); } @Provides @Singleton public Activity provideActivity() { return null; } } // ActivityModule.java文件 @Module public class ActivityModule { private final Activity mActivity; public ActivityModule(Activity activity) { this.mActivity = activity; } } 重点从ActivityComponent.java文件开始分析,它里面有个getActivity()方法。说明是需要其他提供者提供的。 那么到ActivityModule.java文件中去找,并没有发现有提供Activity的方法。那么继续到他的dependenceies中去找,看到AppComponent文件中有 getActivity()方法,而对应的AppModule中有提供Activity的方法。
也就是ActivityComponent中的getActivity()--->AppComponent中的getActivity()--->AppModule中的提供Activity方法。
从生成的对应的源码来看: public final class DaggerAppComponent implements AppComponent { private Provider<Activity> provideActivityProvider; <pre name="code" class="java"> // ...省略private void initialize(final Builder builder) { this.provideActivityProvider = ScopedProvider.create(AppModule_ProvideActivityFactory.create(builder.appModule)); } @Override public Activity getActivity() { return provideActivityProvider.get(); } // ...省略} @Generated("dagger.internal.codegen.ComponentProcessor") public final class AppModule_ProvideActivityFactory implements Factory<Activity> { private final AppModule module; public AppModule_ProvideActivityFactory(AppModule module) { assert module != null; this.module = module; } @Override public Activity get() { Activity provided = module.provideActivity(); if (provided == null) { throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method"); } return provided; } public static Factory<Activity> create(AppModule module) { return new AppModule_ProvideActivityFactory(module); } } 从这里的DaggerAtivityComponent中的getActivity()方法可以看出,调用的是getActivityProvider.get()方法。而这里的 getActivityProvider是由AppComponent中的getActivity()变换生成的。也验证了@Component(dependencies = AppComponent.class...。 @Generated("dagger.internal.codegen.ComponentProcessor") public final class DaggerActivityComponent implements ActivityComponent { private Provider<Activity> getActivityProvider; private DaggerActivityComponent(Builder builder) { assert builder != null; initialize(builder); } public static Builder builder() { return new Builder(); } private void initialize(final Builder builder) { this.getActivityProvider = new Factory<Activity>() { private final AppComponent appComponent = builder.appComponent; @Override public Activity get() { Activity provided = appComponent.getActivity(); if (provided == null) { throw new NullPointerException("Cannot return null from a non-@Nullable component method"); } return provided; } }; } @Override public Activity getActivity() { return getActivityProvider.get(); } // ...省略 } 总结: (1)在Component中如果有相关的getXXX()方法,必然需要在Module中提供XXX实例或者在其他的dependenceies中提供XXX实例。 这里假如将AppComponent中的Activity getActivity()注释掉,则会发生如下错误: Error:(13,21) 错误: android.app.Activity cannot be provided without an @Inject constructor or from an @Provides-annotated method.
这里说明的就是ActivityComponent中的getActivity()中缺少,提供Activity的方法。 @PerActivity @Component(dependencies = AppComponent.class,modules = ActivityModule.class) public interface ActivityComponent { public Activity getActivity(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |