Я читаю исходный код Dagger2 Component Scopes Test на GitHub, и я видел "настраиваемую область", определенную для действий с именем @ActivityScope
, но Я видел это в других проектах, включая 4-модуль CleanArchitecture, который имеет область @PerActivity
.
Но буквально код для аннотации @ActivityScope
следующий:
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 {
}
И это "волшебное" использование в модулях:
@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();
}
}
Или пример CleanArchitecture:
@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;
}
}
Я ясно вижу, что это связано с пользовательскими областями JSR-330, но я действительно не понимаю, что именно происходит здесь, чтобы сделать это так, чтобы этот код позволял данному модулю и/или то, что предоставляется данным модулем, чтобы зависеть от фактического жизненного цикла Activity
, и для того, чтобы существовать только один экземпляр, но только если эта активная активность активна.
Документы говорят следующее:
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.
Он говорит, чтобы посмотреть страницу Компонентные документы, но это дает мне 404. Я также видел this, но...
Могу ли я попросить некоторую помощь в разъяснении, почему магическое создание этой настраиваемой области делает работу Activity-level scopes
без проблем?
(Ответ заключается в том, что подскоп может получать зависимости от своего суперскопа, а подскоп существует до тех пор, пока компонент выполняет. И вам нужно указать области действия в своих модулях, и вам нужно указать зависимости компонентов для подкапа один суперскоп.)