수색…


소개

Dagger 2 는 GitHub 에서 설명한 것처럼 종속성 삽입에 대한 컴파일 타임 진화 접근 방식입니다. Dagger 1.x에서 시작된 접근 방식을 궁극적 인 결론으로 ​​생각하면 Dagger 2.x는 모든 반사를 제거하고 사용자 지정 @Component 인터페이스를 사용하여 기존 ObjectGraph / Injector 를 제거하여 코드 명확성을 향상시킵니다.

비고

  1. 응용 프로그램에서 라이브러리 설정 (Maven, gradle, java 프로젝트 용)
  2. Dragger 사용의 장점
  3. 중요 링크 (문서 및 데모 용)
  4. Dragger 구성 요소를 통합하고 사용하는 방법

단검 2 API :

Dagger 2는 여러 특수 주석을 노출합니다.

메소드가 의존성을 제공하는 클래스 용 @Module

@Module 클래스 내의 메소드 제공 @

@Inject 는 의존성 (생성자, 필드 또는 메소드)을 요청합니다.

@Component 는 모듈과 인젝션 사이의 브리지 인터페이스입니다.

중요 링크 :

GitHub : https://github.com/google/dagger

UserGuide (Google) : https://google.github.io/dagger/users-guide.html

동영상 : https://google.github.io/dagger/resources.html

Vogella 자습서 : http://www.vogella.com/tutorials/Dagger/article.html

Codepath 자습서 : https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

Object에 @Module 클래스와 @Singleton 어노테이션 생성하기

import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;

@Module
public class VehicleModule {
 
    @Provides @Singleton
    Motor provideMotor(){
        return new Motor();
    }
 
    @Provides @Singleton
    Vehicle provideVehicle(){
        return new Vehicle(new Motor());
    }
}

모든 프로 바이더 (또는 메소드)에는 @Provides 주석이 있어야하며 클래스에는 @Module 주석이 있어야합니다. @Singleton 어노테이션은 객체의 인스턴스가 하나만 있음을 나타냅니다.

종속 객체의 종속성 요청

이제 다른 모델의 공급자가 있으므로 요청해야합니다. VehicleMotor 가 필요한 것과 마찬가지로, Vehicle 생성자에서 @Inject 주석을 다음과 같이 추가해야합니다.

@Inject
public Vehicle(Motor motor){
    this.motor = motor;
}

@Inject 어노테이션을 사용하여 생성자, 필드 또는 메소드의 종속성을 요청할 수 있습니다. 이 예제에서는 생성자에 주입을 유지합니다.

@Modules을 @Inject로 연결하기

의존성 공급자 인 @Module@Inject 통해 클래스를 요청하는 클래스 간의 연결은 @Component 라는 인터페이스를 사용하여 이루어집니다.

import javax.inject.Singleton;
import dagger.Component;

@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
    Vehicle provideVehicle();
}

@Component 어노테이션의 경우, 사용할 모듈을 지정해야한다. 이 예제에서는이 예제 에서 정의 된 VehicleModule 이 사용됩니다. 더 많은 모듈을 사용해야하는 경우 쉼표를 구분 기호로 사용하여 추가하십시오.

@Component 인터페이스를 사용하여 객체 가져 오기

이제 모든 연결 준비가 완료되었으므로이 인터페이스의 인스턴스를 가져 와서 필요한 메서드를 가져 오는 메서드를 호출해야합니다.

VehicleComponent component = Dagger_VehicleComponent.builder().vehicleModule(new VehicleModule()).build();
vehicle = component.provideVehicle();
Toast.makeText(this, String.valueOf(vehicle.getSpeed()), Toast.LENGTH_SHORT).show();

@Component 주석을 사용하여 인터페이스의 새 객체를 만들려고하면 Dagger_<NameOfTheComponentInterface> 라는 접두사 (이 경우 Dagger_VehicleComponent )를 사용하여 Dagger_VehicleComponent 다음 빌더 메소드를 사용하여 그 안에있는 모든 모듈을 호출해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow