コード例
class Tiger {
String name;
public Tiger(String name) {
this.name = name;
}
public Tiger() {
}
public void sleep() {
System.out.println("Tiger sleeping");
}
}
// 自定义Qualifier注解
@Qualifier
public @interface Tiger1 {
}
// 自定义Qualifier注解
@Qualifier
public @interface Tiger2 {
}
@Module
class ZooModule {
// 使用自定义Qualifier注解
@Tiger1
@Provides
public Tiger providerTiger_1() {
return new Tiger();
}
@Tiger2
@Provides
public Tiger providerTiger_2() {
return new Tiger("米饭");
}
}
@Component(modules = {
ZooModule.class})
interface ZooComponent {
Zoo inject(Zoo zoo);
}
public class Zoo {
// 使用自定义Qualifier注解,用以区分tiger1到底使用注射器中的哪个对象.
@Tiger1
@Inject
Tiger tiger1;
@Tiger2
@Inject
Tiger tiger2;
@Test
public void 案例九() {
DaggerZooComponent.create().inject(this);
tiger1.sleep();
tiger2.sleep();
}
}
Dagger2で生成されたコード読み取り
主な分析は、同じシリンジに同じタイプの2つのオブジェクトがあり、2つのオブジェクトをコンテナーで使用する必要がある場合を区別する方法です。
上記のケースに基づいてDegger2によって生成されたコードを見ると、生成されたコードはbuild\generated\sources\annotationProcessor\..
フォルダーにあります。
- 呼び出される
.inject(this)
と、最終的に呼び出されるコードは次のようになります。
final class DaggerZooComponent implements ZooComponent {
@Override
public Zoo inject(Zoo zoo) {
return injectZoo(zoo);
}
private Zoo injectZoo(Zoo instance) {
// ZooModule_ProviderTiger_1Factory.providerTiger_1(zooModule): 通过ZooModule中的providerTiger_1()方法获取tiager对象
// ZooModule_ProviderTiger_2Factory.providerTiger_2(zooModule): 通过ZooModule中的providerTiger_2()方法获取tiager对象
Zoo_MembersInjector.injectTiger1(instance, ZooModule_ProviderTiger_1Factory.providerTiger_1(zooModule));
Zoo_MembersInjector.injectTiger2(instance, ZooModule_ProviderTiger_2Factory.providerTiger_2(zooModule));
return instance;
}
}
上記の非常に従来型のコードですが、唯一の違いは、コンテナ内のフィールドにtiger
オブジェクトを割り当てるときに、2つの異なるメソッドがそれぞれ呼び出されることです。
public final class Zoo_MembersInjector implements MembersInjector<Zoo> {
@InjectedFieldSignature("com.yey.dagger2.Zoo.tiger1")
@Tiger1 // 这是案例中定义的注解
public static void injectTiger1(Zoo instance, Object tiger1) {
instance.tiger1 = (Tiger) tiger1;// 容器中tiger1字段赋值为providerTiger_1()返回的对象
}
@InjectedFieldSignature("com.yey.dagger2.Zoo.tiger2")
@Tiger2
public static void injectTiger2(Zoo instance, Object tiger2) {
instance.tiger2 = (Tiger) tiger2;// 容器中tiger2字段赋值为providerTiger_2()返回的对象
}
}
シリンジに同じタイプのオブジェクトが複数ある場合、カスタム@Qualifier
アノテーションは、コンテナが特定のオブジェクトを取得するのに役立ちます。さらに、シリンジに同じタイプのオブジェクトが複数ある場合、Dagger2はエラーと繰り返しのバインドを報告します。