dagger 레코드

4993 단어 daggerModuleAndroid
약서:https://www.jianshu.com/p/9703a931c7e7dagger단례
모듈이 없는 사용 방식: br/>의존 클래스와Component 클래스에 @Singleton을 추가하면 모듈의 사용 방식이 있습니다:Component는 @Singleton 표시를 추가한 다음 모듈에 @provides를 표시하는 방법에 따라 @Singleton을 표시해야 합니다
@Singleton: 생성된 클래스를 단열로 정합니다. 즉, 대상의 활동 시간을 정하는 것은 전역 단례에 속합니다. @Provides 방법을 사용하는 데도 @Component에 설정해야 합니다.
@Scope: 범위, Dagger2에서 적용하면 객체의 라이프 사이클, 즉 객체의 생존 범위를 결정합니다.주석 코스메틱의 @Component 내에서 활동하는 부분 변수의 주석입니다.
프로젝트,Component,Module,Provides,Scope,Qualifier Inject, 즉 주입, 이 주석은 DI 프레임워크를 통해 실례를 주입해야 한다는 것을 표시합니다.프로젝트는 세 가지 방식이 있는데 그것이 바로 Constructor injection,Fields injection,Methods injection이다.Inject가 명시되면 주입 프레임에서 주입할 클래스 실례를 찾아서 주입합니다. 즉 Component를 통해 찾습니다.
Qualifier 클래스 실례가 여러 가지 방식으로 만들어지면 탭 태그를 통해 구분하고 주입할 때 탭을 통해 구분해야 합니다.
Module Module는 클래스 실례가 제공하는 공장 모델입니다. 모델 안의 방법은 기본적으로 클래스 실례를 만드는 방법입니다. Dagger2에는 두 가지 차원에서 클래스 실례를 만들 수 있습니다. Inject 주석으로 표시된 구조 함수를 사용하여 만들 수 있습니다. (약칭 Inject 차원이라고 함) 공장 모델의 모델을 통해 만들 수 있습니다(약칭 Module 차원이라고 함).
ComponentComponent가 해결해야 할 문제는 바로 프로젝트의 실례가 어디에서 왔는가이다. 그래서 이것은 하나의 연결기의 역할을 맡는다.Component는 목표 클래스의 실례를 인용해야 한다. Component는 목표 클래스에서 Inject로 표시된 속성을 찾고 해당하는 속성을 찾은 후에 해당 속성에 대응하는 Inject로 표시된 구조 함수를 찾는다. (이때 연락이 왔다) 나머지 작업은 이 속성의 실례를 초기화하고 실례를 값을 부여하는 것이다.
ScopeDagger2에서 Scope의 관심사는 클래스 인스턴스의 라이프 사이클입니다.
의존관계(dependencies)에 의존하는Component는 노출된 의존 실례를 현식 인터페이스로 설명해야 한다. 예를 들어 위의 카카(Car car)와 같이 우리는 친구가 공유하고 싶은 것만 사용할 수 있다.의존 관계에 있는 Component의 Scope는 라이프 사이클이 다르기 때문에 같을 수 없습니다.
의존Component(PresenterComponent)는 의존Component(AppComponent)에서 제공하는 의존만 계승합니다. 제공하지 않으면 @Inject를 사용하여 의존된Component(AppComponent)의 대상을 주입할 수 없습니다.
상속 관계
SubComponent는 Subcomponent를 명시적으로 선언해야 합니다.Builder, parent Component는 Builder를 사용하여 SubComponent를 만들어야 합니다.
SubComponent를 컴파일할 때DaggerXComponent가 생성되지 않습니다.parent Component를 통해SubComponent를 가져와야 합니다.Builder 메서드에서 SubComponent 인스턴스 가져오기
상속 관계에서 실례에 의존하는 인터페이스를 현저하게 제공하지 않아도 된다.SubComponent상속parent Component의 모든 의존
의존 관계 vs 계승 관계 공통점:
둘 다 다른 Component의 의존을 복용할 수 있습니다. 의존 관계를 가진 두 Component는 같은 @Scope 주석을 가지고 있을 수 없습니다.@SubComponent 를 사용하면 동일한 @Scope 메모를 사용할 수 있습니다.
차이점:
의존 관계에서 의존되는Component는 공개적으로 의존 실례를 제공하는 인터페이스를 현시적으로 제공해야 하며,SubComponent는 기본적으로parent Component의 의존을 계승한다.의존 관계는 두 개의 독립된 DaggerXComponent 클래스를 생성하지만 SubComponent는 독립된 DaggerXXComponent 클래스를 생성하지 않습니다.
Lazy(지연 주입) 때때로 우리가 주입하고자 하는 의존은 사용 시 초기화를 완성하고 적재 속도를 높이면 주입 Lazy를 사용할 수 있습니다.Lazy의 get () 방법을 호출할 때만 의존 실례 주입을 초기화합니다.public class Man {br/> @InjectLazy lazyCar; public void goWork () {lazyCar.get ().go ();//lazyCar.get () 가 Car 실례로 되돌아오기 ();
Provider 주입은 한 개의 실례만 주입하는 것이 아니라 여러 개의 실례가 필요합니다. 이 때 주입Provider를 사용할 수 있습니다. get () 방법을 호출할 때마다 @Inject 구조 함수에 호출하여 새로운 실례를 만들거나 모듈의provide 방법을 사용하여 실례public class CarFactory {br/> @Inject Provider car Provider로 되돌려줍니다.
public List makeCar(int num) {
    ...
    List carList = new ArrayList(num);
    for (int i = 0; i < num; i ++) {
        carList.add(carProvider.get());
    }
    return carList;
}

}
Qualifier (한정자) 는 이러한 상황을 생각해 보았다. 만약 Module가 두 개의 카 실례를 생성하는provide 방법을 제공한다면, Dagger 2는 카 실례를 맨에 주입할 때 어떤 방법을 선택해야 합니까?
@Lazy 및 @Provider
우선 그들의 공통된 역할이다
사용할 때 (get 호출) 이 될 때까지 공장을 제공하는 셈이다.
그럼 레이지와 Provider의 차이점은 무엇일까요?
Lazy를 사용하면 매번 호출할 때마다 같은 대상이 되고,Provider를 사용하면 되돌아오는 대상은 @Provides 방법의 실현에 달려 있습니다. (@Singletone 등을 추가하면 단례일 수도 있고, 그렇지 않으면 아닙니다.)
Dagger2:module에서 @Component(modules =BaseModule.class)public 인터페이스BaseComponent {void inject(MainActivity mainActivity)가 필요합니다.
@Component.Builder
interface Builder {
    //      Builder
    @BindsInstance
    Builder activity(@Nullable FragmentActivity activity);//    fragmentActivity

    @BindsInstance
    Builder fragment(@Nullable Fragment fragment);//    fragment  Nullable:    null

    BaseComponent build();
}

}
@Modulepublic final class Base Module {br/> @Named("Activity")/주입할 때 생성되는 대상은 @ProvidesRxPermissions provideARxPermissions(@Nullable Fragment Activity fragment Activity) {if(fragment Activity =null)return null;return new RxPermissions(fragment Activity);
@Named("fragment")//               
@Provides
RxPermissions provideFRxPermissions(@Nullable Fragment fragment) {
    if (fragment == null) return null;
    return new RxPermissions(fragment);
}

}
public class MainActivity extends App CompatActivity {br/>@Named("Activity")//유형 activity를 만드는 대상 @InjectRxPermissions rxPermissions;
@Named("fragment")
RxPermissions rxPermissionsF;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DaggerBaseComponent.builder().activity(this).fragment(null).build().inject(this);
    Logger.d("rxPermissions:" + rxPermissions);
    Logger.d("rxPermissionsF:" + rxPermissionsF);
}

}

좋은 웹페이지 즐겨찾기