[정수리] Dagger2의 사용 경험을 공유하겠습니다.

10254 단어 Dagger2
1. Gradle 설정
프로젝트의 gradle 스크립트에 플러그인 의존도를 삽입하려면 다음과 같이 하십시오.
buildscript { repositories { jcenter() }
    dependencies { classpath 'com.android.tools.build:gradle:1.3.0' // Add plugin classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' }
}

module의gradle 플러그인에 플러그인을 도입하려면 apt 플러그인을 먼저 도입해야 한다(Dagger2의 원리는 컴파일할 때 코드를 주입하는 것이다)
apply plugin: 'com.neenbedankt.android-apt'

그리고 dependencies에 의존을 추가합니다. 현재 최신 버전은 2.0.2입니다.
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'

    compile 'com.google.dagger:dagger:2.0.2'
    apt 'com.google.dagger:dagger-compiler:2.0.2'
    compile 'org.glassfish:javax.annotation:10.0-b28'
}

마지막 의존은 자바엑스 주석의 의존입니다. 표준 버전의 JDK 1.7 이상은 이 라이브러리에 직접 있지만 Google은 처음부터 유한한 자바엑스 지원만 제공합니다. (Oracle의 API 저작권)
2. 기본 개념
Dagger2를 이해하는 것은 처음에는 어려웠다. 우선 의존 주입의 개념과 왜 의존 주입이 필요한지 이해해야 한다.만약 네가 아직 잘 이해하지 못하더라도 상관없다. 다음의 이 예는 네가 이해하는 데 도움이 될 것이다.
@Inject (주입): 이 주석을 사용하면 현재 설명된 클래스나 속성이 주입되어야 하며, 설정에 따라 실례를 제공합니다. @Module (모듈): Dagger가 의존을 어디서 찾을 수 있는지, 여러 개의 Module를 합쳐서 Component에 의존할 수 있는지 설명합니다. @Provide (제공): 이 주석은 @Module에서 사용되며, 설명의 방법을 정의하면 Dagger에서 Module 설명의 실례를 어떻게 구성하고 제공하는지 알려 줍니다. @Component (구성 요소): 프로젝트와 모듈을 연결하는 용기입니다. 작성된 모듈을 구성 요소에 넣고 프로젝트의 클래스나 속성을 설명합니다. @Scope (역할 영역): Dagger 인스턴스의 라이프 사이클을 설명하는 역할을 하며, 다음 예에서는 사용할 것입니다. @Qualifier:
3. 사용 실례
Step 1: 어셈블리 설명
/** * Created by Hubert on 15/12/9. */
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {

    void inject(BaseActivity baseActivity);

    Context context();

    Preference preference();
}

@Singleton 주석을 사용해서 하나의 예로 설명했습니다.Preference는 사용자의 취향을 저장하기 위한 클래스입니다.
/** * Created by Hubert on 15/12/9. */
public class Preference {

    private String name;

    private boolean enableSSL;

    public boolean isEnableSSL() {
        return enableSSL;
    }

    public void setEnableSSL(boolean enableSSL) {
        this.enableSSL = enableSSL;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Step 2: 모듈 설명
/** * Created by Hubert on 15/12/9. */
@Module
public class AppModule {

    private final DemoApplication application;

    private final Preference preference;

    public AppModule(DemoApplication application, Preference preference) {
        this.application = application;
        this.preference = preference;
    }

    @Provides
    @Singleton
    Context provideApplicationContext() {
        return application;
    }

    @Provides
    @Singleton
    Preference providePreference() {
        return preference;
    }
}

이 모듈은 Preference를 제공할 것이고, Preference는 구조 함수에 전달될 것입니다.
Step 3: 프로그램의 뒷부분을 설명하기 위해 우리 팀이 채택한 프로젝트의 MVP 구조를 설명해 드릴 필요가 있습니다.우선 모든 Activity는 BaseActivity를 상속합니다.
/** * Created by Hubert on 15/12/9. */
public abstract class BaseActivity<T extends Presenter> extends AppCompatActivity {

    private T mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = newPresenter();
    }

    /** * Provide your own presenter for this activity. * * @return Presenter of specific activity. */
    protected abstract T newPresenter();

    protected T getPresenter() {
        return mPresenter;
    }

}

newPresenter 방법이 onCreate에서 호출된다는 것만 이해하면 뒷내용을 충분히 이해할 수 있습니다.
Step 4: 위의 AppComponent는 전역 구성 요소를 제공하고, 다음에는 Activity 구성 요소를 제공합니다.
/** * Created by Hubert on 15/12/9. */
@PerActivity
@Component(dependencies = AppComponent.class, modules = {MainActivityModule.class})
public interface MainActivityComponent {

    void inject(MainActivity mainActivity);

}

Dagger2는Component의 복용을 지원합니다.MainActivityComponent는 AppComponent에 의존합니다. 이것은MainActivityComponent에Preference를 제공합니다. 뒤에 언급될 것입니다.
/** * Created by Hubert on 15/12/9. */
@Module
public class MainActivityModule {

    private final MainActivityViewer mViewer;

    public MainActivityModule(MainActivityViewer viewer) {
        this.mViewer = viewer;
    }

    @Provides
    @PerActivity
    MainActivityPresenter provideMainActivityPresenter(Preference preference) {
        return new MainActivityPresenter(mViewer, preference);
    }

}

MainActivity Module는 MainActivity Presenter를 제공합니다. 그가 제공한 방법에는 Preference 파라미터가 있습니다. 이 파라미터는 Dagger가 자동으로 주입합니다. 관심 있는 사람은 Dagger가 생성한 원본 코드를 볼 수 있습니다.
/** * Created by Hubert on 15/12/9. */
public class MainActivityPresenter extends Presenter<MainActivityViewer> {

    private Preference mPreference;

    public MainActivityPresenter(MainActivityViewer viewer, Preference preference) {
        super(viewer);
        mPreference = preference;
    }


    public void showPreference() {
        getViewer().showToastMessage(mPreference.toString());
    }
}

MainActivityPresenter는 Viewer 인터페이스의 showToastMessage를 호출하는 showPreference () 방법을 제공합니다.
Step 5: 이 안에 있는 모든 것들이 MainActivity에서 통합되어 있습니다.MainActivity에서 newPresenter 방법이 구현되었습니다.
    @Inject
    MainActivityPresenter presenter;

    @Override
    protected MainActivityPresenter newPresenter() {
        DaggerMainActivityComponent.builder()
                .appComponent(DemoApplication.getInstance().getAppComponent())
                .mainActivityModule(new MainActivityModule(this))
                .build().inject(this);
        return presenter;
    }

DaggerMainActivityComponent는 처음에는 존재하지 않았습니다.MainActivityComponent를 다 쓴 후에 컴파일을 클릭하면 생성됩니다.위에서 호출한presenter를 통해 주입되었습니다.

좋은 웹페이지 즐겨찾기