답변:
구성 요소 종속성-두 구성 요소를 독립적으로 유지하려는 경우에 사용하십시오.
하위 구성 요소-두 구성 요소를 결합시키려는 경우에 사용하십시오.
아래 예제를 사용하여 구성 요소 종속성 및 하위 구성 요소 를 설명 합니다. 예제에 주목할만한 몇 가지 사항은 다음과 같습니다.
SomeClassA1
의존없이 만들 수 있습니다. 방법 ModuleA
을 SomeClassA1
통해 제공 및 인스턴스 provideSomeClassA1()
.SomeClassB1
없이는 만들 수 없습니다 SomeClassA1
. ModuleB
의 인스턴스 가 메소드에 인수로 전달 된 SomeClassB1
경우에만 인스턴스를 제공 할 수 있습니다 .SomeClassA1
provideSomeClassB1()
@Module
public class ModuleA {
@Provides
public SomeClassA1 provideSomeClassA1() {
return new SomeClassA1();
}
}
@Module
public class ModuleB {
@Provides
public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) {
return new SomeClassB1(someClassA1);
}
}
public class SomeClassA1 {
public SomeClassA1() {}
}
public class SomeClassB1 {
private SomeClassA1 someClassA1;
public SomeClassB1(SomeClassA1 someClassA1) {
this.someClassA1 = someClassA1;
}
}
단검은 컴포넌트 / 하위 컴포넌트 선언 이 초기화 될 때마다 메소드 SomeClassA1
의 인수로 인스턴스를 전달하는 것을 provideSomeClassB1()
처리합니다 . 의존성을 충족시키는 방법을 Dagger에게 지시해야합니다. 이는 Component dependency 또는 Subcomponent를 사용하여 수행 할 수 있습니다 .ModuleB
ModuleB
아래의 컴포넌트 종속성 예제에서 다음 사항을 참고하십시오.
ComponentB
주석 의 dependencies
메소드를 통해 종속성을 정의해야합니다 @Component
. ComponentA
선언 할 필요가 없습니다 ModuleB
. 이렇게하면 두 구성 요소가 독립적으로 유지됩니다.public class ComponentDependency {
@Component(modules = ModuleA.class)
public interface ComponentA {
SomeClassA1 someClassA1();
}
@Component(modules = ModuleB.class, dependencies = ComponentA.class)
public interface ComponentB {
SomeClassB1 someClassB1();
}
public static void main(String[] args) {
ModuleA moduleA = new ModuleA();
ComponentA componentA = DaggerComponentDependency_ComponentA.builder()
.moduleA(moduleA)
.build();
ModuleB moduleB = new ModuleB();
ComponentB componentB = DaggerComponentDependency_ComponentB.builder()
.moduleB(moduleB)
.componentA(componentA)
.build();
}
}
SubComponent 예제에서 다음 사항을 참고하십시오.
ComponentB
대한 종속성을 정의 ModuleA
하지 않았으므로 독립적으로 살 수 없습니다. 를 제공 할 구성 요소에 따라 달라집니다 ModuleA
. 따라서 @Subcomponent
주석이 있습니다.ComponentA
ModuleB
인터페이스 메소드를 통해 선언했습니다 componentB()
. 이렇게하면 두 구성 요소가 결합됩니다. 실제로는를 ComponentB
통해서만 초기화 할 수 있습니다 ComponentA
.public class SubComponent {
@Component(modules = ModuleA.class)
public interface ComponentA {
ComponentB componentB(ModuleB moduleB);
}
@Subcomponent(modules = ModuleB.class)
public interface ComponentB {
SomeClassB1 someClassB1();
}
public static void main(String[] args) {
ModuleA moduleA = new ModuleA();
ComponentA componentA = DaggerSubComponent_ComponentA.builder()
.moduleA(moduleA)
.build();
ModuleB moduleB = new ModuleB();
ComponentB componentB = componentA.componentB(moduleB);
}
}
SomeClassB1
에 따라 달라집니다 SomeClassA1
. ComponentA
명시 적 종속성을 정의 할 수 있습니다." ==> " ComponentB
명시 적으로 종속성을 정의 해야합니다"를 의미 했습니까?
SomeClassB1
에 의존한다 SomeClassA1
. 의존성을 ComponentA
명시 적으로 정의 할 필요는 없다 " 는 것을 이해한다 . " ComponentB
명시 적으로 종속성을 정의 할 필요는 없습니다 "라는 의미 입니다.
설명서 에 따르면 :
Component Dependency
구성 요소 종속성을 통해 프로 비전 메소드로 노출 된 바인딩에만 액세스 할 수 있습니다. 즉, parent에 선언 된 유형에만 액세스 할 수 있습니다 Component
.
SubComponent
당신에게에 액세스 할 수 있습니다 전체 가 모든 개체에 대한 액세스는 선언이, 예를 선언 할 때 부모로부터 바인딩 그래프 Module
의.
하자의 말, 당신이 ApplicationComponent
모두 포함하는 Android
관련 물건을 ( LocationService
, Resources
, SharedPreference
, 등). 또한 API를 다루기 DataComponent
위해 지속성을 위해 사물을 관리하는 곳을 원합니다 WebService
. 당신이 부족있는 유일한 방법은 DataComponent
이다 Application Context
에있는 상주 ApplicationComponent
. 를 얻을 수있는 간단한 방법 Context
에서은 DataComponent
에 종속 될 것이다 ApplicationComponent
. 신고 된 물건에만 액세스 할 수 있으므로 Context
명시 적으로 신고 ApplicationComponent
해야합니다. 이 경우 수동 작업이 없으므로 Submodules
부모 로 지정하지 않고 Component
하위 모듈을 부모 모듈에 명시 적으로 추가 할 필요가 없습니다 .
MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need!
이제 주입 할 경우 고려 WebService
에서 DataComponent
와 LocationService
에서 ApplicationComponent
당신에 Fragment
사용하는 바인딩 @Submodule
plus
위의 기능을. 여기에 시원한 것은 당신이 (바인딩하고 구성 요소가 있다는 것입니다 ApplicationComponent
) 않습니다 하지 노출 할 필요 WebService
도 LocationService
는 전체 그래프에 액세스 할 수 있기 때문에 지금 당장.
@Submodule
. 오타입니까?
classes
정확한 요점을 설명하기 위해 적은 수의 예제와 더 많은 그림 을 갖는 것이 도움이 될 것 입니다.
다음은 Component 및 SubComponent에 대한 이해를 돕기위한 스크린 샷이있는 코드 예제입니다.
하위 구성 요소 :
출처 : 링크
지금까지 내가 알지 못했던 또 하나의 사실은 다음과 같습니다.
@Subcomponent
(다른 구성 요소가 같은 인스턴스를 수 있지만 인스턴스는 정확히 하나 개의 부모 구성 요소가 @Subcomponent
해당 인스턴스의 부모)@Component
는 컴포넌트 의존성을 통해 선언 된 0 개, 1 개 또는 많은 "부모"컴포넌트를 가질 수 있습니다.