Dagger 2 Android 의존 주입 학습 노트

머리말
최근 MVP+RxJava+Retrofit 로 프로젝트 를 쓰 고 있 습 니 다.다른 개발 프레임 워 크 에 비해 많은 편 의 를 가 져 다 주 었 다 고 생각 합 니 다.하지만 인터넷 에서 관련 자 료 를 찾 을 때 MVP+RxJava+Retrofit+Dagger 와 같은 조합 을 볼 수 있 습 니 다.그러면 Dagger 는 어떤 프레임 워 크 일 까요?저도 구체 적 으로 찾 아 봤 습 니 다.그런데'Dagger 2 입문 부터 포기 까지'라 는 뜻 의 문장 을 보면 Dagger 2 가 어 려 울 것 같 아 요,emmmm.
Dagger2
Dagger 2:A fast dependency injector for Android and Java.(공식 정의)
Dagger 2 는 주 해 를 의존 하 는 프레임 워 크 입 니 다.주 해 를 통 해 구성 요소 간 의 의존 을 실현 하고 이 를 통 해 더 좋 은 결합 을 이 루 는 역할 을 합 니 다.예 를 들 어 Dagger 2 를 우리 의 MVP 프레임 워 크 에 사용 하면 우 리 는 V 층 과 P 층 의 진일보 한 결합 을 이 루어 우리 의 프로젝트 를 더욱 잘 유지 할 수 있 습 니 다.
Dagger 2 는 Butterknife 와 마찬가지 로 컴 파일 단계 에서 자바 주 해 를 이용 하여 APT(Annotation Processing Tool)를 통 해 자바 코드 를 자동 으로 생 성 한 후 우리 가 쓴 코드 로 호출 하여 의존 주입 을 완성 하 므 로 성능 상의 문 제 는 걱정 하지 않 아 도 됩 니 다.그러면 Dagger 2 는 어떻게 사용 하나 요?Dagger 2 를 사용 하 는 것 과 사용 하지 않 는 것 의 차 이 를 살 펴 보 겠 습 니 다.
대비
간단 한 예 로 설명 하 다.예 를 들 어 우 리 는 이런 AAA 류 가 있 는데 내용 이 없고 get()방법 만 있다.

/**
 * @author chaochaowu
 * @Description : AAA
 * @class : AAA
 * @time Create at 6/12/2018 10:58 AM
 */

public class AAA {

 
 public AAA() {
 }

 public void get(){
  Log.e("AAA","has gotten.");
 }

}

우 리 는 MainActivity 에서 이 종 류 를 사용 해 야 하기 때문에 MainActivity 에 이 구성원 변 수 를 포함 하고 이 구성원 변수 aaa 가 있 으 면 우 리 는 이 를 예화 해 야 하기 때문에 다음 과 같은 코드 가 있 을 것 입 니 다.

/**
 * @author chaochaowu
 * @Description : MainActivity
 * @class : MainActivity
 * @time Create at 6/12/2018 10:58 AM
 */
public class MainActivity extends AppCompatActivity {

 AAA aaa;

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

  aaa = new AAA();
  aaa.get();

 }
}
MainActivity 에서 aaa 라 는 변 수 를 설명 한 다음 에 new 인 스 턴 스 를 한 다음 에 호출 하고 정의 하 는 방법 을 호출 할 수 있 습 니 다.이렇게 해서 AAA 클래스 대상 의 생 성 은 MainActivity 와 결합 되 었 습 니 다.Dagger 2 를 사용 하여 의존 주입 을 한다 면?

/**
 * @author chaochaowu
 * @Description : MainActivity
 * @class : MainActivity
 * @time Create at 6/12/2018 10:58 AM
 */
public class MainActivity extends AppCompatActivity {

 @Inject
 AAA aaa;

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

  DaggerMainActivityComponent.create().inject(this);
  
  aaa.get();

 }
}
코드 가 이렇게 돼 요.MainActivity 에 aaa 초기 화 할당 이 없 음 을 발견 할 수 있 습 니 다.하지만 get()방법 을 사용 할 수 있 습 니 다.이렇게 하면 우 리 는 결합 을 이해 하 는 목적 을 달성 할 수 있다.
이러한 간단 한 예 는 Dagger 2 의 장점 을 알 수 없 을 수도 있 습 니 다.그러나 이 Activity 에 AAA 와 같은 구성원 변수 가 많 으 면 초기 화 되 어야 하고 초기 화 되 어야 하 며 인 자 를 전달 해 야 한다 고 상상 할 수 있 습 니 다.그러면 이 Activity 는 비대 해 집 니 다.만약 에 AAA 류 의 초기 화 매개 변수 가 변 하면 AAA 류 뿐만 아니 라 고 쳐 야 합 니 다.MainActivity 는 AAA 류 와 의 결합 도 따라서 바 뀌 어야 하기 때문에 AAA 류 가 MainActivity 에 만 사용 되 는 것 이 아니 라 다른 Activity 에 도 사용 된다 면 고 쳐 야 할 것 이 좀 많아 질 수 있 습 니 다.하지만 Dagger 2 를 사용 하면 이 문 제 를 잘 해결 할 수 있 습 니 다.
설명
Dagger 2 에는@Inject,@Component,@Module,@Provides,@Qulifier,@Scope,@Singleten 이 설명 되 어 있 습 니 다.저희 가 주로 사용 하 는 것 은@Inject,@Component,@Module,@Provides 등 네 가지 입 니 다.다음은 소개 하 겠 습 니 다.
@Inject
Inject 는 주로 의존 해 야 할 변 수 를 표시 하고 Dagger 에 의존 해 야 한 다 는 것 을 알려 줍 니 다.inject 는 클래스 의 구조 함 수 를 표시 하 는 데 도 사용 된다.Dagger 2 가@Inject 주 해 를 사용 하 는 변 수 를 만 났 을 때 이 변 수 는@Inject 주해 에 대응 하 는 구조 함 수 를 찾 아 인 스 턴 스 를 구성 하여 변수 에 의존 합 니 다.
@Component
@Component 는 인 터 페 이 스 를 표시 하 는 데 사용 되 며 수요자(MainActivity)와 공급 자(AAA)에 의존 하 는 다리 입 니 다.Component 에 표 시 된 인 터 페 이 스 는 컴 파일 할 때 이 인터페이스의 실현 클래스 를 생 성 합 니 다.클래스 의 이름 은@Component 에 의 해 주 해 된 클래스 의 이름 앞 에 Dagger 를 추가 합 니 다.우 리 는 이 실현 클래스 를 호출 하 는 방법 으로 주입 을 완성 합 니 다.
@Module
Module 은 의존 하 는 클래스 를 표시 하 는 데 사 용 됩 니 다.비록 우 리 는@Inject 주해 로 주입 을 실현 하지만@Inject 는 구조 함수 만 무 참 류 로 주입 할 수 있 습 니 다.만약 구조 함수 가 매개 변 수 를 가 진 것 이 라면?그러면 module 주 해 를 사용 하여 이 문 제 를 해결 해 야 합 니 다.예 를 들 어 제3자 라 이브 러 리 가 많 습 니 다.우 리 는 코드 를 수정 할 수 없고 구조 함수 에@Inject 주 해 를 추가 할 수 없습니다.그러면 어떻게 합 니까?@module 주석 은 우리 의 문 제 를 잘 해결 할 수 있 습 니 다.
@Provides
Provides 는 Module 과 함께 사 용 됩 니 다.@Provides 는 Module 에 표 시 된 클래스 를 표시 하 는 방법 입 니 다.이 방법 은 의존 을 제공 해 야 할 때 호출 되 고 방법 내 에서 대상 의 초기 화 를 진행 하 며 대상 은@Inject 라 고 표 시 된 변수 에 의존 합 니 다.인자 가 있 는@Inject 에 해당 합 니 다.
구체 적 으로 사용 해 보 겠 습 니 다.
구조 함수 무 참 대상 주입
위 에서 언급 한 AAA 류 로 주입 시연 에 의존 합 니 다.
우선 AAA 류 의 구조 함수 에@Inject 주 해 를 추가 합 니 다.

/**
 * @author chaochaowu
 * @Description : AAA
 * @class : AAA
 * @time Create at 6/12/2018 10:58 AM
 */


public class AAA {

 @Inject
 public AAA() {
 }

 public void get(){
  Log.e("AAA","has gotten.");
 }

}

그리고 MainActivity Component 인 터 페 이 스 를 만 들 고@Component 로 주석 을 달 고 프로젝트 를 빌 드 합 니 다.

/**
 * @author chaochaowu
 * @Description : MainActivityComponent
 * @class : MainActivityComponent
 * @time Create at 6/12/2018 11:03 AM
 */

@Component
public interface MainActivityComponent {
 void inject(MainActivity mainActivity);
}
Build 후 apt 는 다음 코드 를 자동 으로 생 성 합 니 다.

build 후 생 성.png
우 리 는 그 중의 DaggerMainActivity Component 를 이용 하여 MainActivity 와 AAA 류 간 의 다 리 를 구축 합 니 다.다음 코드

/**
 * @author chaochaowu
 * @Description : MainActivity
 * @class : MainActivity
 * @time Create at 6/12/2018 10:58 AM
 */
public class MainActivity extends AppCompatActivity {

 @Inject
 AAA aaa;

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

  DaggerMainActivityComponent.create().inject(this);

  aaa.get();

 }

}

이로써 우 리 는 구조 함수 가 인삼 이 없 는 대상 의 의존 주입 을 완성 했다.
구조 함수 인삼 포함 대상 주입
많은 것 을 믿 을 때 우리 가 사용 해 야 할 대상 은 구조 할 때 매개 변수 가 필요 하 다.그러면 우 리 는 그들의 의존 주입 을 어떻게 진행 할 것 인가?여기 서 나 는 MVP 중의 Presenter 로 시범 을 보 여 준다.

/**
 * @author chaochaowu
 * @Description : MainActivity
 * @class : MainActivity
 * @time Create at 6/12/2018 10:58 AM
 */
public class MainActivity extends AppCompatActivity implements MainContract.View{
 
 MainContract.Presenter mPresenter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  mPresenter = new MainPresenter(this);
  mPresenter.getData();

 }

}
위의 코드 는 Dagger 2 를 사용 하지 않 았 을 때의 Activity 입 니 다.MVP 프레임 워 크 에서 Presenter 는 View 와 상호작용 을 해 야 하기 때문에 View 의 대상 을 가 져 야 하기 때문에 초기 화 할 때 구조 함수 에 View 대상 을 매개 변수 로 입력 해 야 합 니 다.코드 에서 mPresenter=new MainPresenter(this)를 볼 수 있 습 니 다.
다음 에 우 리 는 그것 에 의존 주입 을 한다.먼저 Presenter 를 보 세 요.Presenter 는 어떠한 변화 도 할 필요 가 없습니다.우 리 는 그의 구조 함수 가 하나의 매개 변수 View 를 가지 고 있 는 것 을 볼 수 있 습 니 다.

/**
 * @author chaochaowu
 * @Description : MainPresenter
 * @class : MainPresenter
 * @time Create at 6/11/2018 2:22 PM
 */
public class MainPresenter implements MainContract.Presenter{
 MainContract.View mView;
 public MainPresenter(MainContract.View mView) {
  this.mView = mView;
 }

 @Override
 public void getData() {

 }
}
그 다음 에 우 리 는 MainActivity Module 류 를 만 들 고 이 유형 에@Module 주 해 를 추가 해 야 합 니 다.이것 은 구성원 변수 mView 가 함 수 를 만 들 때 값 을 부여 해 야 합 니 다.우 리 는 나중에 이 변 수 를 Presenter 에 Presenter 구 조 를 할 것 입 니 다.우 리 는 방법 을 쓰 고 그 위 에@Provides 주 해 를 추가 해 야 합 니 다.방법의 이름 은 마음대로 지 을 수 있 는 것 이 아 닙 니 다.그러나 코드 의 가 독성 을 위해 서 는 일반적으로 provide 시작 에 provide 의 이름 을 추가 합 니 다.우 리 는 이 방법 에서 우리 가 제공 하고 자 하 는 의존 대상 을 되 돌려 줍 니 다.여 기 는 Presenter 대상 을 되 돌려 주 었 습 니 다.여기 서 구 조 를 볼 수 있 고 우 리 는 매개 변수 View 를 들 어 왔 습 니 다.이로써 MainActivity Module 의 정 의 를 완 성 했 습 니 다.사실은 이 MainActivity Module 의 역할 은 이전의 구조 함수 무 참 중의 무 참 구조 함수 Inject 절차 에 대한 성질 과 같 습 니 다.

/**
 * @author chaochaowu
 * @Description : MainActivityModule
 * @class : MainActivityModule
 * @time Create at 6/11/2018 2:41 PM
 */
@Module
public class MainActivityModule {
 MainContract.View mView;

 public MainActivityModule(MainContract.View mView) {
  this.mView = mView;
 }
 @Provides
 public MainContract.Presenter providePresenter(){
  return new MainPresenter(mView);
 }
}
다음은 구조 함수 가 참여 하지 않 은 대상 주입 과 마찬가지 로 MainActivity Component 를 정의 하고@Component 로 주 해 를 해 야 합 니 다.다른 것 은 괄호 에 인자 modules={MainActivity Module.class}을 추가 해 야 합 니 다.

/**
 * @author chaochaowu
 * @Description : MainActivityComponent
 * @class : MainActivityComponent
 * @time Create at 6/11/2018 2:45 PM
 */
@Component(modules = {MainActivityModule.class})
public interface MainActivityComponent {
 void inject(MainActivity mainActivity);
}
프로젝트 빌 드

build 후 생 성.png
이렇게 하면 우 리 는 위 와 같이 Activity 에서 Dagger Main Activity Component 를 호출 하여 의존 주입 을 할 수 있다.Activity 의 코드 를 보 세 요.

/**
 * @author chaochaowu
 * @Description : MainActivity
 * @class : MainActivity
 * @time Create at 6/12/2018 10:58 AM
 */
public class MainActivity extends AppCompatActivity implements MainContract.View{

 @Inject
 MainContract.Presenter mPresenter;

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

  DaggerMainActivityComponent.builder()
    .mainActivityModule(new MainActivityModule(this))
    .build()
    .inject(this);

  mPresenter.getData();

 }
}
이 를 통 해 알 수 있 듯 이 DaggerMainActivity Component 호출 방법 이 다 릅 니 다.그 중에서 mainActivity Module()방법 을 호출 하여 MainActivity Module 대상 에 들 어 갔 습 니 다.이 대상 의 초기 화,우 리 는 this,즉 View 를 들 어 왔 습 니 다.이 View 는 우리 가 나중에 Presenter 를 만 들 때 들 어 온 매개 변수 입 니 다.
이로써 우 리 는 구조 함수 에 인삼 이 있 는 대상 의 의존 주입 을 완성 했다.다른 파 라 메 트릭,제3자 라 이브 러 리 의 의존 주입 도 이런 방식 으로 진행 된다.
총결산
Dagger 2 의 사용 은 우리 코드 의 결합 도 를 더욱 낮 추 었 습 니 다.이것 은 장점 입 니 다.그러나 다른 한편,Dagger 2 를 사용 하면 일부 종 류 를 추가 로 정의 해 야 하기 때문에 코드 의 수량 도 증가 합 니 다.개인 적 으로 작은 프로젝트 에서 사용 하면 좀 emmmm..................................................................지우 기)하지만 한 항목 이 크 고 코드 자체 도 많 으 면 Dagger 2 가 가 져 온 장점 을 사용 하면 나타 날 수 있 습 니 다.그 러 니까 프로젝트 에서 Dagger 2 인 자 를 사용 하 는 지 아 닌 지 는 인 지 를 보 는 사람 이 지혜 를 보 는 사람 이 지혜 를 보 는 것 이지 만 공부 하 는 점 으로서 좋 은 것 같 아.응?
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기