Dagger2 시리즈의 Scope
그리고 이 역할 영역에서 하나의 실례를 공용합니다.이렇게 하면 단일 모드처럼 보입니다. @Singleton이 @Scope의 기본 구현일 뿐입니다.물론, 너는 같은Component 대상에서 생성해야 한다
Dagger는 Scope의 Singleton 구현을 지원합니다.단례???no!!!no!!!no!!!그렇게 쉬운 게 아니야.코드부터 살펴보겠습니다.
@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}
Dagger에서 주석을 사용자 정의할 수 있습니다. 예를 들어 위의 모델에 따라PreScope를 사용자 정의할 수 있습니다.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PreScope {
}
우리가 사용자 정의한 이 PreScope 주석도 Singleton과 같은 작용을 한다.다음은 사용법을 살펴보겠습니다!!!
@Module
public class AppModule7 {
private App7 app;
public AppModule7(App7 app) {
this.app = app;
}
@Provides
@Singleton
public App7 provideApp() {
return app;
}
@Provides
@Singleton
Context provideApplicationContext() {
return app.getApplicationContext();
}
}
@Singleton
@Component(modules = {AppModule7.class})
public interface AppComponent7 {
void inject(App7 app);
// AppComponent dependencies, Module ,
App7 getApp();
Context getApplicationContext();
}
@Module
public class ActivityModule7 {
@Provides
@PreScope
public DependencyPresenter7 getDependencyPresenter(App7 app){
return new DependencyPresenter7(app);
}
}
@PreScope
@Component(modules = ActivityModule7.class,dependencies = AppComponent7.class)
public interface ActivityComponent7 {
void inject(TargetActivity71 activity71);
void inject(TargetActivity72 activity72);
}
public class App7 extends Application {
private AppComponent7 mAppComponent7;
private ActivityComponent7 mActivityComponent7;
@Override
public void onCreate() {
super.onCreate();
mAppComponent7 = DaggerAppComponent7.builder().appModule7(new AppModule7(this)).build();
mAppComponent7.inject(this);
mActivityComponent7 = DaggerActivityComponent7.builder().appComponent7(mAppComponent7).build();
}
public AppComponent7 getAppComponent7(){
return mAppComponent7;
}
public ActivityComponent7 getActivityComponent7(){
return mActivityComponent7;
}
}
public class DependencyPresenter7 {
public DependencyPresenter7(App7 app){
Log.d("Dagger.class","DependencyPresenter7----- --------");
}
public void printMethod(){
Log.d("Dagger.class","DependencyPresenter7-----printMethod()-----");
}
}
public abstract class BaseActivity712 extends Activity {
private ActivityComponent7 mActivityComponent7;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
App7 app712 = (App7) getApplication();
mActivityComponent7 = app712.getActivityComponent7();
inject(mActivityComponent7);
}
public abstract void inject(ActivityComponent7 activityComponent7);
}
public class TargetActivity71 extends BaseActivity712 {
@Inject
DependencyPresenter7 mDependencyPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Dagger.class","TargetActivity71---mDependencyPresenter -------"+mDependencyPresenter.toString());
}
@Override
public void inject(ActivityComponent7 activityComponent7) {
activityComponent7.inject(this);
}
public void jump(View v){
startActivity(new Intent(this,TargetActivity72.class));
}
}
public class TargetActivity72 extends BaseActivity712 {
@Inject
DependencyPresenter7 mDependencyPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Dagger.class","TargetActivity72---mDependencyPresenter -------"+mDependencyPresenter.toString());
}
@Override
public void inject(ActivityComponent7 activityComponent7) {
activityComponent7.inject(this);
}
}
위 코드는 Dagger가 기본적으로 실행하는 @Singleton과 사용자 정의 @PreScope 주석을 함께 사용합니다.우리가 Dagger에서 제공하는 Singleton만 사용하지 않고 사용자 정의를 사용하는 이유는 우리가 사용하는 영역이 다르기 때문입니다. 서로 다른 Component가 의존 의존이나 포함 관계가 있을 때 같은 Scope를 사용할 수 없기 때문에 사용자 정의가 필요합니다.
다음은 내가 학습 과정에서 총결한 결론이다.
1 동일한 Component 객체를 사용하여 생성해야 합니다. 즉, DaggerActivityComponent7.builder().build () 는 한 번만 실행할 수 있습니다.
2 Component 와 Module 은 동일한 Scope 를 사용합니다.같은 Module에서 같은 Scope를 사용해야 합니다. 그렇지 않으면 해당하는Component에서 어떤 Scope를 사용해야 하는지 모릅니다.
3 종속 관계가 있거나 포함된 Component에서는 동일한 Scope를 사용할 수 없습니다.
위의 세 가지 결론은 바로 Singleton을 사용하는 것을 배울 때 정리한 것이다. 모두가 공부할 때 자신도 검증하는 것이 가장 좋다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.