(9)Dagger2 @ Qualifierケース分析

コード例
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はエラーと繰り返しのバインドを報告します。

おすすめ

転載: blog.csdn.net/MoLiao2046/article/details/106884536