Dagger 2 얕은 것부터 깊은 것까지 (1)

5260 단어 Dagger
Dagger 제품군:
  • Dagger 2 얕은 것에서 깊은 것(하나)
  • Dagger 2 얕은 것에서 깊은 것(2)
  • Dagger2 얕은 것부터 깊은 것까지 (3)
  • Dagger 2 얕은 것에서 깊은 것(4)
  • Dagger 2의 깊이(5)
  • Dagger 2 얕은 것부터 깊은 것까지 (6)
  • Dagger2 얕은 것부터 깊은 것(7)
  • Dagger2는 안드로이드에 적용되는 완벽한 확장 라이브러리 - dagger.android

  • 데모 주소:
  • DaggerLearn
  • Kotlin-Dagger-2-Retrofit-Android-Architecture-Components

  • 개술
    Dagger 2 공식 문서에는 "A fast dependency injector for Android and Java."라는 문구가 있습니다.안드로이드와 자바에 적용되는 빠른 의존 주입
    여기에는 주로 Dagger2를 알고 의존 주입에 대한 서술이 많지 않다.의존 주입을 이해하지 못하면 다음과 같은 블로그를 참고할 수 있다.
  • 제어반전(IoC)과 의존주입(DI)
  • 간단한 의존 주입
  • 이해 의존 주입(IOC) 및 학습 Unity
  • Gradle 구성
    Gradle 플러그인은 2.3 이상이면 이렇게 설정할 수 있습니다
    dependencies {
      compile 'com.google.dagger:dagger:2.x'
      annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
    }
    

    Gradle 플러그인이 2.3 이하이면 apt 플러그인을 빌려야 합니다.
  • 뿌리gradle에서
    dependencies {
         ... //   classpath
         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //  apt  
     }
    
  • App.gradle 중
    dependencies {
      compile 'com.google.dagger:dagger:2.x'
      apt 'com.google.dagger:dagger-compiler:2.x'
    }
    
  • @Inject
    Dagger 2에서 javax를 사용합니다.inject.Inject 주석은 Dagger 구성 응용 프로그램 클래스의 인스턴스를 충족하고 의존성을 충족하기 위해 주입에 의존해야 하는 구조 함수와 필드를 식별합니다.
    @Inject에는
  • 주해 구조 함수: 표기 구조 함수를 통해 Dagger2에게 이 클래스의 실례를 만들 수 있음을 알려 줍니다. (Dagger2는 Inject 표기를 통해 이 클래스의 실례가 필요할 때 이 구조 함수를 찾을 수 있고 관련 실례를 new로 출력할 수 있습니다.) 의존 관계를 제공합니다.
  • 주석 의존 변수: 표기 의존 변수를 통해Dagger2는 의존 관계를 제공하고 주입 변수
  • 주해 구조 함수
    여기에는 Dagger 2의 인스턴스를 만들기 위해 StudentBean 객체의 구조 함수가 @Inject에 주석되어 있음을 설명합니다.
    public class StudentBean {
        private int no;
        private String name;
    
        @Inject
        public StudentBean() {
            this.no = 1;
            this.name = "  ";
        }
    
        ***
    }
    

    테스트:
    public class StudentActivity extends BaseActivity {
    
        ***
    
            @Inject
            StudentBean studentBean;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                ButterKnife.bind(this);
                // Log("student:StudentBean{no=1, name='  '}")
                Log.d("test", "student:" + studentBean.toString());
                tvStu.setText(studentBean.toString());
            }
    
        ***
    }
    

    여기에 StudentBean 실례를 간단하게 주입하면 완성된 셈이다.
    콜아웃 필드
    이때 의문이 하나 생겼다. 모든 구성원 변수가 기본 데이터 형식이 아니라 어떤 구성원 변수 자체가 하나의 유형의 실례이다. 그러면 우리는 의존 주입을 사용할 수 있을까?기왕 이런 의문이 있는 바에는 한번 해 보아도 무방하다.
  • AreaBean과ScoreBean을 만들고 그 구조 함수는 모두
    public class AreaBean {
        private String provice;
        private String city;
    
        @Inject
        public AreaBean() {
            this.provice = "  ";
            this.city = "  ";
        }
    
        ***
    }
    
    public class ScoreBean {
        private double chinese;
        private double math;
    
        @Inject
        public ScoreBean() {
            this.chinese = 90.5;
            this.math = 78.0;
        }
    
        ***
    }
    
  • Student 실례를 수정하고 두 개의 구성원 변수를 증가시켰다. 분포는AreaBean,ScoreBean
    public class StudentBean {
        private int no;
        private String name;
    
        @Inject
        AreaBean areaBean;
        @Inject
        ScoreBean scoreBean;
    
        @Inject
        public StudentBean() {
            this.no = 1;
            this.name = "  ";
        }
    
        ***
    }
    
  • 테스트 public class StudentActivity extends BaseActivity {
    ***
    
        @Inject
        StudentBean studentBean;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ButterKnife.bind(this);
            // Log:student:StudentBean{no=1, name='  ', areaBean=AreaBean{provice='  ', city='  '},scoreBean=ScoreBean{chinese=90.5, math=78.0}}
            Log.d("test", "student:" + studentBean.toString());
            tvStu.setText(studentBean.toString());
        }
    
    ***
    
    }
  • 테스트 결과에서 @Inject 메모 필드라도 Dagger는 해당 인스턴스를 작성하여 삽입할 수 있음을 분명히 알 수 있습니다.
    참고:
  • 클래스에 @Inject 주석 필드가 있지만 이 필드는 @Inject 주석 함수를 사용하지 않습니다.이 때 Dagger는 요청할 때 이 필드를 주입하지만 새로운 실례를 만들지 않고 빈 대상을 가져옵니다.@Inject 주석을 사용하여 매개 변수가 없는 구조 함수를 추가하여 Dagger가 인스턴스를 만들 수도 있음을 나타냅니다.이 때 컴파일이 성공하지 못하면 Provider 방법을 추가하고 필요한 실례를 제시하는 프롬프트가 나타날 수도 있습니다.
  • Dagger 지원 방법은 주입하지만, 일반적으로 구조기나 필드의 의존 주입에 사용됩니다.

  • @Inject는 만능이 아닙니다.
    @Inject는 만능이 아닙니다. 알 수 없는 것에 대해서는 무력합니다.예를 들어, 익숙한 인터페이스, 인터페이스는 실례를 만들 수 없습니다. 이 때 @Inject 주석을 사용할 수 없습니다.
  • 인터페이스를 생성할 수 없음
  • 제3자 라이브러리의 클래스를 만들 수 없음
  • 설정 대상은 반드시 설정해야 합니다!

  • 끝말
    지금까지 Dagger 2 입문의 간단한 예는 이미 실현되었다.간단하게 요약하면 다음과 같습니다.
  • @Inject 주석 구조 함수, 이 클래스가 Dagger에 의뢰하여 실례를 만들었음을 표시합니다
  • @Inject는 이 의존을 주입하는 속성 변수를 설명합니다.만약 이 변수 능력이 실례적인 대상이라면, 구조 함수는 @Inject 주석을 사용하거나 Provider 방법을 통해 제공해야 합니다.
  • @Inject는 만능이 아닙니다.

  • 참조 문서
  • Dagger2의 사용 분석
  • 안드로이드:dagger2 놓치지 않게 - 기초 의존 주입 프레임편
  • 안드로이드:dagger2 놓치지 않게 - 중점개념설명, 융합편
  • 안드로이드:dagger2당신을 놓치지 않게 - 종결편
  • '샐러드 한 접시'가 Dagger2(하나)의 HelloWorld
  • 에 입문시켜 줍니다.
  • Dagger2 도문완전교
  • 왜 인터넷에dagger2 강좌가 이렇게 많은지 나는 이 글을 썼다.
  • 좋은 웹페이지 즐겨찾기