수색…


통사론

  • @기준 치수
  • @Component (종속성 = {OtherComponent.class}, 모듈 = {ModuleA.class, ModuleB.class})
  • DaggerMyComponent.create ()
  • DaggerMyComponent.builder (). myModule (newMyModule ()). create ()

비고

사각형으로 된 단검과 단검의 전신 인 2를 혼동하지 마십시오.

응용 프로그램 및 활동 주입을위한 구성 요소 설정

단일 AppModule 에 의존하여 응용 프로그램 전체의 단일 객체를 제공하는 기본 AppComponent 입니다.

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {

    void inject(App app);

    Context provideContext();

    Gson provideGson();
}

싱글 톤 객체를 제공하는 AppComponent 와 함께 사용할 모듈입니다 (예 : 전체 응용 프로그램에서 다시 사용할 Gson 인스턴스).

@Module
public class AppModule {

    private final Application mApplication;

    public AppModule(Application application) {
        mApplication = application;
    }

    @Singleton
    @Provides
    Gson provideGson() {
        return new Gson();
    }

    @Singleton
    @Provides
    Context provideContext() {
        return mApplication;
    }
}

대거 및 싱글 톤 구성 요소를 설정하기위한 하위 클래스 화 된 응용 프로그램입니다.

public class App extends Application {

    @Inject
    AppComponent mAppComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        DaggerAppComponent.builder().appModule(new AppModule(this)).build().inject(this);
    }

    public AppComponent getAppComponent() {
        return mAppComponent;
    }
}

이제 Singleton 객체에 액세스하기 위해 AppComponent 에 의존하는 활성 범위가 지정된 구성 요소.

@ActivityScope
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface MainActivityComponent {

    void inject(MainActivity activity);
}

그리고 FragmentManager 와 같은 기본적인 의존성을 제공 할 재사용 가능한 ActivityModule

@Module
public class ActivityModule {

    private final AppCompatActivity mActivity;

    public ActivityModule(AppCompatActivity activity) {
        mActivity = activity;
    }

    @ActivityScope
    public AppCompatActivity provideActivity() {
        return mActivity;
    }


    @ActivityScope
    public FragmentManager provideFragmentManager(AppCompatActivity activity) {
        return activity.getSupportFragmentManager();
    }
}

모든 것을 모으기 위해 우리는 준비가되어 있으며 우리의 활동을 주입 할 수 있으며 앱을 통해 같은 Gson 을 사용해야합니다!

public class MainActivity extends AppCompatActivity {

    @Inject
    Gson mGson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerMainActivityComponent.builder()
                .appComponent(((App)getApplication()).getAppComponent())
                .activityModule(new ActivityModule(this))
                .build().inject(this);
    }
}

사용자 지정 범위

@Scope
@Documented
@Retention(RUNTIME)
public @interface ActivityScope {
}

스코프는 주석 일 뿐이며 필요에 따라 고유 한 스코프를 만들 수 있습니다.

생성자 삽입

의존성이없는 클래스는 단도로 쉽게 만들 수 있습니다.

public class Engine {

    @Inject // <-- Annotate your constructor.
    public Engine() {
    }
}

이 클래스는 모든 구성 요소에서 제공 할 수 있습니다. 의존성 자체없고 범위없습니다 . 더 이상의 코드는 필요하지 않습니다.


종속성은 생성자에서 매개 변수로 선언됩니다. Dagger는 생성자를 호출하고 종속성을 제공 할 수 있습니다 (종속성을 제공 할 수있는 경우).

public class Car {

    private Engine engine;

    @Inject
    public Car(Engine engine) {
        this.engine = engine;
    }
}

이 클래스는이 구성 요소가 모든 종속성 (이 경우 Engine 을 제공 할 수있는 경우 모든 구성 요소에서 제공 할 수 있습니다. Engine 은 생성자로도 삽입 될 수 있기 때문에 모든 구성 요소가 Car 제공 할 수 있습니다.

구성 요소가 모든 종속성을 제공 할 수있을 때마다 생성자 주입을 사용할 수 있습니다. 구성 요소는 종속성을 제공 할 수 있습니다.

  • 생성자 삽입을 사용하여 생성 할 수 있습니다.
  • 구성 요소의 모듈이이를 제공 할 수 있습니다.
  • 부모 컴포넌트에 의해 제공 될 수있다 ( @Subcomponent )
  • 그것은 의존하는 컴포넌트에 의해 노출 된 객체를 사용할 수있다 (컴포넌트 의존성)

@Component 대신 @Subcomponent 사용 (종속성 = {...})

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(App app);

    Context provideContext();
    Gson provideGson();

    MainActivityComponent mainActivityComponent(ActivityModule activityModule);
}

@ActivityScope
@Subcomponent(modules = ActivityModule.class)
public interface MainActivityComponent {
    void inject(MainActivity activity);
}

public class MainActivity extends AppCompatActivity {

    @Inject
    Gson mGson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((App)getApplication()).getAppComponent()
                .mainActivityComponent(new ActivityModule(this)).inject(this);
    }
}

build.gradle에서 Dagger 2를 추가하는 방법

Gradle 2.2가 출시 된 이래로 android-apt 플러그인을 더 이상 사용하지 않습니다. Dagger 2를 설정하는 다음 방법이 사용되어야합니다. 이전 버전의 Gradle의 경우 아래 표시된 이전 방법을 사용하십시오.

Gradle> = 2.2 인 경우

dependencies {
    // apt command comes from the android-apt plugin
    annotationProcessor 'com.google.dagger:dagger-compiler:2.8'
    compile 'com.google.dagger:dagger:2.8'
    provided 'javax.annotation:jsr250-api:1.0'
}

Gradle <2.2

Dagger 2를 사용하려면 android-apt plugin을 추가하고 루트 build.gradle에 추가해야합니다.

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

그런 다음 응용 프로그램 모듈의 build.gradle에 다음을 포함해야합니다.

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
    

android {
    …
}

final DAGGER_VERSION = '2.0.2'
dependencies {
    …

    compile "com.google.dagger:dagger:${DAGGER_VERSION}"
    apt "com.google.dagger:dagger-compiler:${DAGGER_VERSION}"
}

참조 : https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

여러 모듈에서 구성 요소 만들기

Dagger 2는 여러 모듈에서 구성 요소를 만드는 것을 지원합니다. 이 방법으로 구성 요소를 만들 수 있습니다.

@Singleton
@Component(modules = {GeneralPurposeModule.class, SpecificModule.class})
public interface MyMultipleModuleComponent {
    void inject(MyFragment myFragment);
    void inject(MyService myService);
    void inject(MyController myController);
    void inject(MyActivity myActivity);
}

GeneralPurposeModuleSpecificModule 이라는 두 개의 참조 모듈을 다음과 같이 구현할 수 있습니다.

GeneralPurposeModule.java

@Module
public class GeneralPurposeModule {
    @Provides
    @Singleton
    public Retrofit getRetrofit(PropertiesReader propertiesReader, RetrofitHeaderInterceptor headerInterceptor){
        // Logic here...
        return retrofit;
    }

    @Provides
    @Singleton
    public PropertiesReader getPropertiesReader(){
        return new PropertiesReader();
    }

    @Provides
    @Singleton
    public RetrofitHeaderInterceptor getRetrofitHeaderInterceptor(){
         return new RetrofitHeaderInterceptor();
    }
}

SpecificModule.java

@Singleton
@Module
public class SpecificModule {
    @Provides @Singleton
    public RetrofitController getRetrofitController(Retrofit retrofit){
        RetrofitController retrofitController = new RetrofitController();
        retrofitController.setRetrofit(retrofit);
        return retrofitController;
    }

    @Provides @Singleton
    public MyService getMyService(RetrofitController retrofitController){
        MyService myService = new MyService();
        myService.setRetrofitController(retrofitController);
        return myService;
    }
}

종속성 삽입 단계에서 구성 요소는 필요에 따라 두 모듈의 객체를 가져옵니다.

이 방법은 모듈성 측면에서 매우 유용합니다. 이 예에서는 Retrofit 객체 (네트워크 통신을 처리하는 데 사용됨) 및 PropertiesReader (구성 파일 처리 책임자)와 같은 구성 요소를 인스턴스화하는 데 사용되는 범용 모듈이 있습니다. 또한 특정 응용 프로그램 구성 요소와 관련하여 특정 컨트롤러 및 서비스 클래스의 인스턴스화를 처리하는 특정 모듈이 있습니다.



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