Dagger2 Benutzerdefinierte Bereiche : Wie custom-Bereiche (@ActivityScope) tatsächlich funktionieren?

Lese ich den Quellcode für Dagger2 Komponente Bereiche Test auf GitHub, und ich habe gesehen, einem "benutzerdefinierten Bereich" definiert, die für die Tätigkeiten genannt @ActivityScope, aber ich habe gesehen, dass es in anderen Projekten, wie der 4-Modul CleanArchitecture, der hat seine @PerActivity Umfang.

Aber wörtlich, den code für die @ActivityScope Anmerkung ist die folgende:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.inject.Scope;

/**
 * Created by joesteele on 2/15/15.
 */
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

Und es ist "magisch" verwendbar in den Modulen:

@Module
public class ActivityModule {
  @Provides @ActivityScope Picasso providePicasso(ComponentTest app, OkHttpClient client) {
    return new Picasso.Builder(app)
        .downloader(new OkHttpDownloader(client))
        .listener(new Picasso.Listener() {
          @Override public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
            Log.e("Picasso", "Failed to load image: " + uri.toString(), e);
          }
        })
        .build();
  }
}

Oder die CleanArchitecture Beispiel:

@Scope
@Retention(RUNTIME)
public @interface PerActivity {}

@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
  //Exposed to sub-graphs.
  Activity activity();
}

@Module
public class ActivityModule {
  private final Activity activity;

  public ActivityModule(Activity activity) {
    this.activity = activity;
  }

  /**
  * Expose the activity to dependents in the graph.
  */
  @Provides @PerActivity Activity activity() {
    return this.activity;
  }
}

Kann ich deutlich sehen, dass dies hat zu tun mit JSR-330 benutzerdefinierte Bereiche, aber ich wirklich nicht verstehen, was genau hier passiert, es so zu machen, dass dieser code ermöglicht das angegebene Modul und/oder das, was ein bestimmtes Modul angewiesen auf die tatsächliche Activity Lebenszyklus, und es existiert nur eine einzige Instanz, aber nur, wenn das gegebene Aktivität aktiv ist.

Die docs sagen:

Scope

Dagger 1 only supported a single scope: @Singleton. 
Dagger 2 allows users to any well-formed scope annotation. 
The Component docs describe the details of 
    how to properly apply scope to a component.

Sagt er zu Blick auf die Komponente docs-Seite, aber das gibt mir 404. Ich sah auch diese, aber...

Darf ich Fragen, für etwas Hilfe bei der Klärung, warum die Angabe dieser benutzerdefinierten Bereich magisch macht Activity-level scopes arbeiten, ohne ein Problem?

(Die Antwort ist, ein subscope erhalten können Abhängigkeiten von seiner superscope, und ein subscope besteht, solange die Komponente tut. Und, dass Sie müssen angeben, dass die Bereiche, die auf Ihre Module, und Sie müssen angeben, dass Ihre Komponente Abhängigkeiten zu subscope eine superscope.)

Schreibe einen Kommentar