依赖图:Application Component
Application Module @Provide @Singleton
Activity Component
Activity Module @Provide @PerActivity
User Component
User Module @Provide @PerActivity
详解
Application Component,全应用生命周期的component,注入AndroidApplication和BseActivity类
@Singleton // Constraints this component to one-per-application or unscoped bindings.
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
void inject(BaseActivity baseActivity);
//Exposed to sub-graphs.
Context context();
ThreadExecutor threadExecutor();
PostExecutionThread postExecutionThread();
UserRepository userRepository();
}
@Singleton,应用内唯一component
module中的类必须明确向外暴露,否则不可见
Application Module, 提供全应用周期的对象
@Module
public class ApplicationModule {
private final AndroidApplication application;
public ApplicationModule(AndroidApplication application) {
this.application = application;
}
@Provides @Singleton Context provideApplicationContext() {
return this.application;
}
@Provides @Singleton Navigator provideNavigator() {
return new Navigator();
}
@Provides @Singleton ThreadExecutor provideThreadExecutor(JobExecutor jobExecutor) {
return jobExecutor;
}
@Provides @Singleton PostExecutionThread providePostExecutionThread(UIThread uiThread) {
return uiThread;
}
@Provides @Singleton UserCache provideUserCache(UserCacheImpl userCache) {
return userCache;
}
@Provides @Singleton UserRepository provideUserRepository(UserDataRepository userDataRepository) {
return userDataRepository;
}
}
注入应用内全局对象, @Provide都带上@Singleton
Activity Component,Activity生命周期component
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
//Exposed to sub-graphs.
Activity activity();
}
@PerActivity自定义,activity周期
@Scope
@Retention(RUNTIME)
public @interface PerActivity {}
能activity对象构建是注入
可在Activity范围内使用singleton模式
这些对象只在Activity里用,全局对象图保持清晰
Activity Module: 暴露activity给依赖图
@Module
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides @PerActivity Activity activity() {
return this.activity;
}
}
使用activity作为context的fragment
User Component: 扩展自AcitvityComponent
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = {ActivityModule.class, UserModule.class})
public interface UserComponent extends ActivityComponent {
void inject(UserListFragment userListFragment);
void inject(UserDetailsFragment userDetailsFragment);
}
@PerActivity,activity生命周期,注入用户相关fragments
ActivityModule已经暴露activity context, 子modules不再做
User Module:用户相关的协作对象
@Module
public class UserModule {
@Provides @PerActivity GetUserListUseCase provideGetUserListUseCase(GetUserListUseCaseImpl getUserListUseCase) {
return getUserListUseCase;
}
@Provides @PerActivity GetUserDetailsUseCase provideGetUserDetailsUseCase(GetUserDetailsUseCaseImpl getUserDetailsUseCase) {
return getUserDetailsUseCase;
}
}
user的use cases, 取列表,取详情
实例
BaseActivity:Navigator
public abstract class BaseActivity extends Activity {
@Inject Navigator navigator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getApplicationComponent().inject(this);
}
protected ApplicationComponent getApplicationComponent() {
return ((AndroidApplication)getApplication()).getApplicationComponent();
}
protected ActivityModule getActivityModule() {
return new ActivityModule(this);
}
}
成员注入,ApplicationModule显式提供依赖项
onCreate里调用getApplicationComponent()后inject注入
Application对象初始化ApplicationComponent
Activity-Fragment
activity范围UserComponent注入UserDetailsFragment,存在UserDetilsActivity里
private UserComponent userComponent;
private void initializeInjector() {
this.userComponent = DaggerUserComponent.builder()
.applicationComponent(getApplicationComponent())
.activityModule(getActivityModule())
.build();
}
Dagger实现component并以Dagger作为命名前缀,组合的component所以传入所有依赖的component和module参数
@Override public UserComponent getComponent() {
return userComponent;
}
为满足Fragment的依赖,提供接口
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.getComponent.inject(this);
}
Fragment里调用Component的inject传入fragment参数
HasComponent接口类
public interface HasComponent<C> {
C getComponent();
}
BaseFragment类
@SuppressWarnings("unchecked")
protected <C> C getComponent(Class<C> componentType) {
return componentType.cast(((HasComponent<C>)getActivity()).getComponent());
}
Dagger2生成代码
DaggerApplicationComponent实现ApplicationComponent