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 인 자 를 사용 하 는 지 아 닌 지 는 인 지 를 보 는 사람 이 지혜 를 보 는 사람 이 지혜 를 보 는 것 이지 만 공부 하 는 점 으로서 좋 은 것 같 아.응?
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Dagger 2.10의 Android를 확장해 보십시오.Dagger 2.10에 안드로이드용 확장 모듈 공개 이런 Dagger2, Dagger2.10RC는 안드로이드용 확장 모듈을 공개했다.비록 의것이지만, 나는 여전히 충분하지 않고 이해하기 어렵다고 생각한다. 이번에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.