在Dagger 中,可以创建一个组件的层次结构,其中子组件可以依赖父组件.
通过dependencies 参数来实现组件层次结构.
dependencies参数是@ Component 注解的参数.
// ApplicationCommponent 作为父组件
@Singleton
@Component(modules = NetWorkModule.class)
public interface ApplicationCommponent {
// void injectUser(TextDaggerActivity mainActivity);
Retrofit getRetrofit();
}
@Module
public class NetWorkModule {
@Provides
@Singleton
public Retrofit provideRetrofit(){
return new Retrofit.Builder()
.baseUrl("https://www.google.com")
.build();
}
@Singleton
@Provides
public Api providesApi(Retrofit retrofit){
return retrofit.create(Api.class);
}
}
创建子组件, 通过dependencies 指向了ApplicationCommponent.class
@UserScoped
@Component(modules = UserModule.class,dependencies = ApplicationCommponent.class)
public interface UserCommponent {
void inject(TextDaggerActivity activity);
}
UserModule.java
@Module
public class UserModule {
@UserScoped
@Provides
public User provideUser(){
return new User();
}
}
User.java
public class User {
public User(){
}
}
自定义注解接口,用于区分父组件作用域.
@Scope
@Documented
@Retention(RUNTIME)
public @interface UserScoped {
}
获取子组件实例
public class TextDaggerActivity extends AppCompatActivity {
@Inject
Retrofit retrofit1;
@Inject
User user;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerUserCommponent.builder().applicationCommponent(App.applicationCommponent).build().inject(this);
Log.e("retrofit1----","address: "+retrofit1);
Log.e("user----","address: "+user);
}
}
打印结果
E/retrofit1----: address: retrofit2.Retrofit@5707fc6
E/user----: address: com.zh.hellokotlin.dagger.bean.User@f8eb87
使用dependencie需要注意的点
Component容器中功能对象只能在一个 容器中引用声明. 不能重复.在UserCommponent类中,inject 参数是TextDaggerActivity. 而'TextDaggerActivity'就不可以在其他Component 容器中使用.
作用域. 子组件和父组件作用域是不一样的.需要区分开.
-
子组件不能直接访问父组件的Module, 需要父组件显示的声明.
在上述例子中,父组件Module, 提供了获取Retrofit,Api. 实例. 需要在父组件容器中,动态的声明,如下. 这样子组件就可以拿到父组件中的实例.
-
拿到子容器实例不同
获取子容器实例需要使用 DaggerXXX.builder().父组件容器(父组件容器实例).build().函数();