Dagger2의 간단한 사용

Dagger2의 간단한 사용


문서 목록

  • Dagger2의 간단한 사용
  • 1.예비지식
  • 1.1 주석 개념
  • 1.2 제어 반전과 의존 주입 개념
  • 2.Dagger2 사용
  • 2.1 기본 사용 방법
  • 2.2 @Module 및 @Provides
  • 2.3 @Named 및 @Qualifier
  • 2.4 @Singleton 및 @Scope
  • 2.5@Component의dependencies
  • 2.6 게으름
  • 3.참고 자료
  • 1. 예비 지식


    1.1 메모 개념

  • 주석은 코드에 있는 특수한 표지로서 이러한 표지는 컴파일, 클래스 불러오기, 실행할 때 읽히고 해당하는 처리를 수행할 수 있다.
  • 주해는 표준 주해와 원 주해로 나뉜다.
  • 표준 주석:
  • @Override: 하이퍼클래스를 덮어쓰는 방법을 표시합니다.
  • @Deprecated: 사용을 권장하지 않거나 유행이 지난 방법에 주석을 추가합니다.
  • @SuppressWarnings: 특정 코드 세그먼트의 경고를 선택적으로 취소합니다.
  • @SafeVarargs: 가변 길이 매개변수를 사용하는 방법을 선언합니다.

  • 원 주해:
  • @Targe: 메모가 코스메틱한 객체 범위입니다.
  • @Inherited: 메모가 상속될 수 있음을 나타냅니다.
  • @Documented: 메모가 JavaDoc 도구에 기록되어야 함을 나타냅니다.
  • @Retention: 메모의 보존 정책을 선언합니다.
  • @Repeatable: 같은 성명 형식 (클래스, 속성, 방법) 에서 주석을 여러 번 사용할 수 있습니다.


  • 1.2 제어 반전과 의존 주입 개념

  • 제어 반전: IoC(Inversion of Control)
  • '제3자'의 도움을 빌려 의존 관계를 가진 대상 간의 결합을 실현한다.
  • 원래 여러 개의 결합 대상이 현재 모두 Ioc용기에 의존하고 각 대상 간에 서로 의존하지 않으며 결합 해체 작업을 실현했다.
  • 예를 들어 대상 A는 대상 B에 의존하고 A는 운행 과정에서 B가 필요할 때 주동적으로 B를 만들고 제어권은 대상 A에 있다.현재 IoC 용기를 도입한 후 A가 B를 필요로 할 때 IoC 용기는 주동적으로 대상 B를 만들어 대상 A가 필요로 하는 곳에 주입한다. 이때 대상 A는 주동에서 수동으로 바뀌고 제어권이 반전된다.
  • 의존 주입: DI(Dependency Injection)
  • 제어반전은 의존 대상을 얻는 과정이 반전되는 것을 말한다.
  • 의존 주입은 IoC 용기가 운행하는 동안 동적으로 어떤 의존 관계를 대상에 주입하는 것을 말한다.
  • 자주 사용하는 의존 주입 방식:
  • 구조 방법 주입.
  • Setter 메소드 주입.
  • 인터페이스 주입.


  • 2. Dagger2의 사용

  • Dagger2는 JSR-330(Java 의존 주입) 표준을 바탕으로 하는 의존 주입 프레임워크로 컴파일하는 동안 자동으로 코드를 생성하고 의존 대상의 생성을 책임진다.
  • 홈페이지:https://github.com/google/dagger

  • 2.1 기본 사용 방법

  • 종속 라이브러리 추가:
  • api 'com.google.dagger:dagger:2.24'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
    
  • @Inject 및 @Conponent
  • //Tips.class       
    import javax.inject.Inject;
    
    public class Tips {
    
        @Inject
        public Tips() {
        }
    
        public String getTip() {
            return "        !";
        }
    }
    
    /**
    * MainActivityComponent.class
    *        ,(        )
    *     :    (    )+Component
    */
    import dagger.Component;
    
    @Component
    public interface MainActivityComponent {
        void inject(MainActivity mainActivity);
    }
    
    /**
    * MainActivity.class   
    * 1 :@Inject         。
    * 2 :    。
    */
    @Inject//1
    Tips tips;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_main);	
        DaggerMainActivityComponent.create().inject(this);//2
        tips.getTip();
    }
    

    2.2 @Module 및 @Provides

  • 상황1: 제3자 라이브러리 사용
  • //GsonModule.class
    import com.google.gson.Gson;
    
    import dagger.Module;
    import dagger.Provides;
    
    @Module
    public class GsonModule {
        @Provides
        public Gson provideGson(){
            return new Gson();
        }
    }
    
    //GsonModule.class
    import com.virtual.learnrxjava.GsonModule;
    import com.virtual.learnrxjava.MainActivity;
    
    import dagger.Component;
    
    @Component(modules = GsonModule.class)
    public interface MainActivityComponent {
        void inject(MainActivity mainActivity);
    }
    
  • 상황2: 주입해야 할 대상은 추상적
  • //  SubClass.class     SuperClass.class
    @Module
    public class SubModule {
        @Provides
        public SuperClass getSubClass(){
            return new SubClass();
        }
    }
    

    2.3 @Named 및 @Qualifier

  • @Qualifier는 한정자이고, @Named는 @Qualifier의 일종이다.
  • @Named 사용법:
  • @Module
    public class GsonModule {
        @Provides
        @Named("g1")
        public Gson provideGsonA(){
            return new Gson();
        }
        
        @Provides
        @Named("g2")
        public Gson provideGsonB(){
            return new Gson();
        }
    }
    
    //    
    @Injetc
    public showJson(@Named("g1") Gson gson){
        ...
    }
    
  • @Named에서 전달하는 값은 문자열만 가능합니다. @Qualifier는 주석을 사용자 정의하는 데 더욱 유연합니다.
  • @Qualifier 사용법:
  • //    
    //myGson1.class
    @Qualifier
    @Retention(RUNTIME)
    public @interface myGson1{
    }
    
    //myGson2.class
    @Qualifier
    @Retention(RUNTIME)
    public @interface myGson2{
    }
    
    @Module
    public class GsonModule {
        @Provides
        @myGson1
        public Gson provideGsonA(){
            return new Gson();
        }
        
        @Provides
        @myGson2
        public Gson provideGsonB(){
            return new Gson();
        }
    }
    
    @Injetc
    public showJson(@myGson1 Gson gson){
        ...
    }
    

    2.4 @Singleton 및 @Scope

  • @Scope: 메모를 사용자화합니다.
  • @Singleton: @Scope와 함께 국부 단례와 전역 단례를 실현합니다.
  • 국부 단례의 실현:
  • @Module
    public class GsonModule {
        @Singleton
        @Provides
        public Gson provideGson(){
            return new Gson();
        }
    }
    
    @Singleton
    @Component(modules = GsonModule.class)
    public interface MainActivityComponent {
        void inject(MainActivity mainActivity);
    }
    
  • 전역 단례의 실현:
  • //    
    @Scope
    @Retention(RUNTIME)
    public @interface ApplicationScope{
    }
    
    @Module
    public class GsonModule {
        @ApplicationScope
        @Provides
        public Gson provideGson(){
            return new Gson();
        }
    }
    
    @ApplicationScope
    @Component(modules = GsonModule.class)
    public interface MainActivityComponent {
        void inject(MainActivity mainActivity);
    }
    
    //  App  Application
    import android.app.Application;
    import android.content.Context;
    
    public class App extends Application {
        ActivityComponent activityComponent;
    
        @Override
        public void onCreate() {
            super.onCreate();
            activityComponent=DaggerActivityComponent.builder().build();
        }
        
        public static App get(Context context){
            return (App)context.getApplicationContext();
        }
        
        ActivityComponent getActivityComponent(){
            return activityComponent;
        }
    }
    
  • 다중 Activity 처리 가능:
  • @ApplicationScope
    @Component(modules = GsonModule.class)
    public interface ActivityComponent {
        void inject(MainActivity activity);
        void inject(SecondActivity activity);
    }
    

    2.5 @Component의 dependencies

  • @Component는dependencies로 다른Component에 의존할 수 있습니다.
  • //  New.class
    import javax.inject.Inject;
    
    public class New {
        @Inject
        public New(){
        }
    
        public String msg(){
            return "Hello!";
        }
    }
    
    //  NewModule.class
    import dagger.Module;
    import dagger.Provides;
    
    @Module
    public class NewModule {
        @Provides
        public New providerNew(){
            return new New();
        }
    }
    
    //  NewComponent.class
    import dagger.Component;
    
    @Component(modules = NewModule.class)
    public interface NewComponent {
        New getNew();
    }
    
    @Component(modules = GsonModule.class,dependencies = NewComponent.class)
    public interface ActivityComponent {
        void inject(MainActivity activity);
        void inject(SecondActivity activity);
    }
    
    //  App.class  
     @Override
        public void onCreate() {
            super.onCreate();
            activityComponent=DaggerActivityComponent.builder().
                newComponent(DaggerNewComponent.create()).build();
        }
    

    2.6 게으름 피우기

  • **@Inject**에서 초기화하지 않고 사용할 때 초기화하고 **를 호출합니다.get ()** 방법으로 실례를 가져옵니다.
  • //    
    @Inject
    Lazy<Tips> tipsLazy;
    
    ...
        
        Tips tipsExample = tipsLazy.get()
    

    3. 참고 자료

  • 안드로이드 진급의 빛
  • 좋은 웹페이지 즐겨찾기